티스토리 뷰
<?php /** * Class Beverage * * @author jsyang < jsyang@simplexi.com > * @since ${DAY} * @version 1.0 */ // 상속의 문제 - 서블크래스를 만드는 방식으로 행동을 상속 받으면 그 행동은 커파일시 완전히 결정이 되고, 모든 서브 클래스에서 // 똑같이 행동을 상속 받아야 한다. // 하지만 수정을 통해 객체의 행동을 확장하면 실행중에 동적으로 행동을 설정할 수 있다. // 상속을 통해 확장을 할 수도 있지만, 디자인 유연성 면에서는 별로 좋지 않다. // 기존 코드를 수정하지 않고도 행동을 확장하는 방법이 필요하다. // 구성과 위임을 통해서 실행중에 새로운 행동을 추가할 수 잇다. // 상속 대신 데코레이터 패턴을 통해서 행동을 확장 할 수 잇다. // 데코레이터 패턴에서는 구상 구성 요소를 감싸주는 데코레이터를 사용한다. // 데코레이터의 슈퍼 클래스는 자신이 장식하고 있는 객체의 슈퍼클래스와 같다. abstract class Beverage { public $_description = "제목없음"; public function getDescription() { return $this->_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 150 + $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(); } } $Espresso = new Espresso(); echo $Espresso->getDescription() . ":" . $Espresso->cost() . "\n"; $DarkRost = new DarkRost(); echo $DarkRost->getDescription() . ":" . $DarkRost->cost() . "\n"; $DarkRost = new Whip($DarkRost); echo $DarkRost->getDescription() . ":" . $DarkRost->cost() . "\n"; $DarkRost = new Soy($DarkRost); echo $DarkRost->getDescription() . ":" . $DarkRost->cost() . "\n"; $Mocha = new MoCha($DarkRost); //echo $Mocha->getDescription() . ":" . $Mocha->cost() . "<br/>"; $Mocha = new MoCha($Mocha); //echo $Mocha->getDescription() . ":" . $Mocha->cost() . "<br/>";
'웹개발 > Php' 카테고리의 다른 글
PHP - DateTime을 활용하여 날짜 계산하기 (0) | 2017.04.04 |
---|---|
state 패턴 샘플 (0) | 2017.02.06 |
옵저버패턴샘플 (0) | 2017.02.06 |
Apater 패턴 샘플 (0) | 2017.02.06 |
추상팩토리 패턴 샘플 소스 (0) | 2017.02.06 |
댓글