티스토리 뷰
- 인스턴스 ( 인스턴스 장식 )
- 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 방안
- 어떤 객체에 대해 동적으로 부가적인 책임(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 |
댓글