<?php /** * 装饰者模式 * 装饰者以横向增长的方式扩展类的功能, * 而不是以继承的方式纵向扩展类的功能, * 从而有效防止继承的子类爆炸式的增多。 * 来自<<深入PHP,面向对象,模式与实践>> */ abstract class Tile { abstract function getWealthFactor(); } class Plains extends Tile{ private $wealthfactor = 2; public function getWealthFactor() { return $this->wealthfactor; } } //<--------------使用继承---------------> class DiamondPlains extends Plains { function getWealthFactor() { return parent::getWealthFactor() + 2; } } class PollutedPlains extends Plains { function getWealthFactor() { return parent::getWealthFactor() - 4; } } //获取diamond和polluted的健康系数 $diamond = new DiamondDecorator(); $diamondHealth = $diamond->getWealthFactor(); $polluted = new PollutedPlains(); $pollutedHealth = $polluted->getWealthFactor(); //<--------------使用装饰者---------------> //装饰者超类 class TileDecorator { protected $tile; //获取需要装饰的对象。 function __construct(Tile $tile) { $this->tile = $tile; } } class DiamondDecorator extends TileDecorator{ function getWealthFactor() { return $this->tile->getWealthFactor() + 2; } } class PollutionDecorator extends TileDecorator{ function getWealthFactor() { return $this->tile->getWealthFactor() - 4; } } //获取diamond和polluted的健康系数 //获取diamond装饰的tile对象的健康系数 $diamond = new DiamondDecorator(new Tile); $diamondHealth = $diamond->getWealthFactor(); //获取polluted装饰的tile对象的健康系数 $polluted = new PollutionDecorator(new Tile); $pollutedHealth = $polluted->getWealthFactor(); ?>