デコレーター パターン

Decorator Pattern

Decorator パターン | デザインパターン

2022年9年23日
デザインパターン Decorator PHP
...

オライリージャパンによる Head First シリーズ デザインパターン(第2版)第3章 Observer パターンを、PHPで書き直してみようという試みです。

Beverage.php


namespace Decorator;

abstract class Beverage {

  public string $description = '不明な飲み物';

  public function getDescription() : string {

    return $this->description;

  }

  public abstract function cost() : float;

}
      

Espresso.php


namespace Decorator;

class Espresso extends Beverage {

  public function __construct() {

    $this->description = 'エスプレッソ';

  }

  public function cost() : float {

    return 1.99;

  }

}
      

DarkRoast.php


namespace Decorator;

class DarkRoast extends Beverage {

  public function __construct() {

    $this->description = 'ダークローストコーヒー';

  }

  public function cost() : float {

    return 0.99;

  }

}
      

HouseCoffee.php


namespace Decorator;

class HouseCoffee extends Beverage {

  public function __construct(){

    $this->description = 'ハウスブレンドコーヒー';

  }

  public function cost() : float {

    return 0.89;

  }

}
      

CondimentDecorator.php


namespace Decorator;

abstract class CondimentDecorator extends Beverage {

  public Beverage $beverage;

}
      

Soy.php


namespace Decorator;

class Soy extends CondimentDecorator {

  public function __construct(Beverage $beverage){

    $this->beverage = $beverage;

  }

  public function getDescription() : string {

    return $this->beverage->getDescription() . '、豆乳';

  }

  public function cost() : float {

    return $this->beverage->cost() + 0.15;

  }

}
      

Mocha.php


namespace Decorator;

class Mocha extends CondimentDecorator {

  public function __construct(Beverage $beverage){

    $this->beverage = $beverage;

  }

  public function getDescription() : string {

    return $this->beverage->getDescription() . '、モカ';

  }

  public function cost() : float {

    return $this->beverage->cost() + 0.20;

  }

}
      

Whip.php


namespace Decorator;

class Whip extends CondimentDecorator {

  public function __construct(Beverage $beverage){

    $this->beverage = $beverage;

  }

  public function getDescription() : string {

    return $this->beverage->getDescription() . '、ホイップ';

  }

  public function cost() : float {

    return $this->beverage->cost() + 0.10;

  }

}
      

index.php


use Decorator\Espresso;
use Decorator\DarkRoast;
use Decorator\HouseCoffee;
use Decorator\Soy;
use Decorator\Mocha;
use Decorator\Whip;

$beverage = new Espresso();
echo $beverage->getDescription() . ' $' . $beverage->cost();
echo "\n";

$beverage2 = new DarkRoast();
$beverage2 = new Mocha($beverage2);
$beverage2 = new Mocha($beverage2);
$beverage2 = new Whip($beverage2);
echo $beverage2->getDescription() . ' $' . $beverage2->cost();
echo "\n";

$beverage3 = new HouseCoffee();
$beverage3 = new Soy($beverage3);
$beverage3 = new Mocha($beverage3);
$beverage3 = new Whip($beverage3);
echo $beverage3->getDescription() . ' $' . $beverage3->cost();
echo "\n";

      

出力結果


 エスプレッソ $1.99
 ダークローストコーヒー、モカ、モカ、ホイップ $1.49
 ハウスブレンドコーヒー、豆乳、モカ、ホイップ $1.34
      

だてめがね
...
©️ ponpocopy

とある企業で社内SEをしています。 自身の学びが誰かの為になれば、という想いで日々ブログを更新中。 PHP(CakePHP・Laravel・FuelPHP), Pyhotn(Django・Flask), C#(ASP.NET、Unity) が好きです。