티스토리 뷰

웹개발/Php

데코레이터패턴 샘플

야쿠 yaku 2017.02.06 10:15
<?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
옵저버패턴샘플  (0) 2017.02.06
Apater 패턴 샘플  (0) 2017.02.06
추상팩토리 패턴 샘플 소스  (0) 2017.02.06
댓글
댓글쓰기 폼