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