裝飾器模式(Decorator):動態的給一個對象添加一些額外的職責,就增長功能來講,裝飾器比生成子類更加靈活。php
這裏以一個遊戲角色爲例,角色自己自帶基礎攻擊屬性,也能夠經過額外的武器裝備增長屬性值。這裏的裝備武器就是動態的給角色添加額外的職責。
一、角色Role.php,對應Componentthis
/** * 角色,抽象類 * Class Role */ abstract class Role { /** * @return mixed */ abstract public function getName(); /** * @return mixed */ abstract public function getAggressivity(); }
二、武器Arms.php,對應ConcreteComponentspa
/** * 武器,繼承抽象類 * Class Arms */ class Arms extends Role { /** * 基礎攻擊力 * @var int */ private $aggressivity = 100; /** * @return string */ public function getName() { // TODO: Implement getName() method. return '基礎攻擊值'; } /** * @return int */ public function getAggressivity() { // TODO: Implement getAggressivity() method. return $this->aggressivity; } }
三、裝飾抽象類RoleDecorator.php,對應Decoratorcode
/** * 裝飾抽象類 * Class RoleDecorator */ abstract class RoleDecorator extends Role { /** * @var Role */ protected $role; /** * RoleDecorator constructor. * @param Role $role */ public function __construct(Role $role) { $this->role = $role; } }
四、劍Sword.php,對應ConcreteDecorator對象
/** * 劍,具體裝飾對象,繼承裝飾抽象類 * Class Sword */ class Sword extends RoleDecorator { /** * @return mixed|string */ public function getName() { // TODO: Implement getName() method. return $this->role->getName() . '+斬妖劍'; } /** * @return int|mixed */ public function getAggressivity() { // TODO: Implement getAggressivity() method. return $this->role->getAggressivity() + 200; } }
五、槍Gun.php,對應ConcreteDecoratorblog
/** * 槍,具體裝飾對象,繼承裝飾抽象類 * Class Gun */ class Gun extends RoleDecorator { /** * @return mixed|string */ public function getName() { // TODO: Implement getName() method. return $this->role->getName() . '+震天戟'; } /** * @return int|mixed */ public function getAggressivity() { // TODO: Implement getAggressivity() method. return $this->role->getAggressivity() + 150; } }
六、調用繼承
// 基礎攻擊值 $arms = new Arms(); echo $arms->getName(); echo $arms->getAggressivity() . '<br>'; // 基礎攻擊值+斬妖劍 $sword = new Sword(new Arms()); echo $sword->getName(); echo $sword->getAggressivity() . '<br>'; // 基礎攻擊值+震天戟 $gun = new Gun(new Arms()); echo $gun->getName(); echo $gun->getAggressivity() . '<br>'; // 基礎攻擊值+斬妖劍+震天戟 $person = new Gun(new Sword(new Arms())); echo $person->getName(); echo $person->getAggressivity() . '<br>';
七、結果:接口
基礎攻擊值100 基礎攻擊值+斬妖劍300 基礎攻擊值+震天戟250 基礎攻擊值+斬妖劍+震天戟450