티스토리 뷰
<?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 |
댓글