티스토리 뷰

<?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
댓글
댓글쓰기 폼