티스토리 뷰

웹개발/Php

데코레이터 패턴 정리

야쿠 yaku 2010.07.05 14:27

  • 인스턴스  ( 인스턴스 장식 )
  • 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 방안
  • 어떤 객체에 대해 동적으로 부가적인 책임(responsibilities)을 부여하고자 할 때 사용된다.
  • Decorator 패턴은 기능을 확장하거나, 서브 클래스를 생성하는 것에 대해 유연한 대안을 제공한다.
  • 예) 음료의 첨가물 ( 설탕, 프림, 꿀 등등등 ) 매번 구현하지 않고  첨가물이 인스턴스를 가지고 있어서 장식한다.
  • 잔치짓 커피 에는 설탕, 프림, 다 들어 간다.
  • 아메리카노에는 커피만 들어간다.
  • OCP 원칙 확장에는 열려있어야 하고 변경에는 닿혀 있어야 한다.

 

_description;
	}

	abstract function cost();
}


abstract class CondimentDecorator extends Beverage
{
	function __construct() {}
	public function getDescription(){}
}


class Espresso extends Beverage
{
	function __construct() {
		$this->_description = "Espresso";
	}

	function cost(){
		return 300;
	}
}


class HouseBlend extends Beverage
{
	function HouseBlend() {
		$this->_description = "HouseBlend Coffee";
	}

	function cost()
	{
		return 400;
	}
}


class DarkRost extends Beverage
{
	function DarkRost() {
		$this->_description = "DarkRost Coffee";
	}

	function cost()
	{
		return 1500;
	}
}



class Mocha extends CondimentDecorator
{
	public $_beverage;

	function __construct($beverage) {
		$this->_beverage = $beverage;
	}

	function getDescription() {
		return $this->_beverage->getDescription() .  ", Mocha";
	}

	function cost() {
		return 203 + $this->_beverage->cost();
	}
}

class Whip extends CondimentDecorator
{
	public $_beverage;

	function __construct($beverage) {
		$this->_beverage = $beverage;
	}

	function getDescription() {
		return $this->_beverage->getDescription() .  ", Whip";
	}

	function cost() {
		return 390 + $this->_beverage->cost();
	}
}


class Soy extends CondimentDecorator
{
	public $_beverage;

	function __construct($beverage) {
		$this->_beverage = $beverage;
	}

	function getDescription() {
		return $this->_beverage->getDescription() .  ", Soy";
	}

	function cost() {
		return 1000 + $this->_beverage->cost();
	}
}

$beverage = new Espresso();
echo $beverage->getDescription() . ":" . $beverage->cost() . "
"; $beverage2 = new DarkRost(); echo $beverage2->getDescription() . ":" . $beverage2->cost() . "
"; $beverage2 = new MoCha($beverage2); echo $beverage2->getDescription() . ":" . $beverage2->cost() . "
"; $beverage2 = new MoCha($beverage2); echo $beverage2->getDescription() . ":" . $beverage2->cost() . "
"; $beverage2 = new Whip($beverage2); echo $beverage2->getDescription() . ":" . $beverage2->cost() . "
"; $beverage2 = new Soy($beverage2); echo $beverage2->getDescription() . ":" . $beverage2->cost() . "
";
결과
Espresso:300
DarkRost Coffee:1500
DarkRost Coffee, Mocha:1703
DarkRost Coffee, Mocha, Mocha:1906
DarkRost Coffee, Mocha, Mocha, Whip:2296
DarkRost Coffee, Mocha, Mocha, Whip, Soy:3296
신고

'웹개발 > Php' 카테고리의 다른 글

XDEBUG PROFILE  (0) 2010.12.15
PHP 매직 메소드  (0) 2010.11.25
Php Session 정보  (0) 2010.11.24
추상 팩토리 패턴 그리고 의존성 주입에 대한 내 생각  (0) 2010.09.03
PHP CURL 정리  (953) 2010.09.01
데코레이터 패턴 정리  (0) 2010.07.05
댓글
댓글쓰기 폼