装饰模式重视代码的组合和委托,轻松的实现合并对象,在 <<php面向对象、模式与实践>>中举了一个非常形象的实例。游戏中不同的区域单元被占领后会得到相应的金钱,当然如果这个地区存在钻石则会增加额外的金币,但是地区被污染的话则会减少金币。
//定义基类
abstract class Title {
abstract function getJinbi();
}
//子类实现
class Plains extends Title {
private $jinbi = 2;//增加2个金币
function getJinbi() {
return $this->jinbi;
}
}
//如果存在钻石增加金币
class DiamondPlains extends Plains {
function getJinbi () {
return parent::getJinbi() + 2;
}
}
//如果被污染则减少金币
class PulltedPlains extends Plains {
function getJinbi () {
return parent::getJinbi() - 4;
}
}
显然这段代码不够灵活,原因是我们可以单独获取占领后得到的金币,也可以单独获取有钻石和被污染的金币,但是我们呀想得到
被占领后总的金币却不行,要单独写一个运算的class计算。这时候可以使用装饰模式。进行对象的组合
//定义基类
abstract class Title {
abstract function getJinbi();
}
//子类实现
class Plains extends Title {
private $jinbi = 2;//增加2个金币
function getJinbi() {
return $this->jinbi;
}
}
//声明一个 TitleDecrator重新定义 DiamondPlains 和 PulltedPlains
abstract class TitleDecrator {
protected $title;//定义一个Title属性,目的是给子类继承
function __construct(Title $title) {
$this->title = $title;
}
}
//如果存在钻石增加金币
class DiamondPlains extends TitleDecrator {
function getJinbi () {
return $this->title->getJinbi() + 2;
}
}
//如果被污染则减少金币
class PulltedPlains extends TitleDecrator {
function getJinbi () {
return $this->title->getJinbi()getJinbi() - 4;
}
}
这样我们可以计算单独计算占领后、有钻石和被污染的金币,重要的是可以计算总的金币数
$obj = new PulltedPlains( new DiamondPlains( new Plains() ) );
从最里面Plains()计算占领得金币数、往外计算DiamondPlains钻石加成 最后PulltedPlains污染减分。
//定义基类
abstract class Title {
abstract function getJinbi();
}
//子类实现
class Plains extends Title {
private $jinbi = 2;//增加2个金币
function getJinbi() {
return $this->jinbi;
}
}
//如果存在钻石增加金币
class DiamondPlains extends Plains {
function getJinbi () {
return parent::getJinbi() + 2;
}
}
//如果被污染则减少金币
class PulltedPlains extends Plains {
function getJinbi () {
return parent::getJinbi() - 4;
}
}
显然这段代码不够灵活,原因是我们可以单独获取占领后得到的金币,也可以单独获取有钻石和被污染的金币,但是我们呀想得到
被占领后总的金币却不行,要单独写一个运算的class计算。这时候可以使用装饰模式。进行对象的组合
//定义基类
abstract class Title {
abstract function getJinbi();
}
//子类实现
class Plains extends Title {
private $jinbi = 2;//增加2个金币
function getJinbi() {
return $this->jinbi;
}
}
//声明一个 TitleDecrator重新定义 DiamondPlains 和 PulltedPlains
abstract class TitleDecrator {
protected $title;//定义一个Title属性,目的是给子类继承
function __construct(Title $title) {
$this->title = $title;
}
}
//如果存在钻石增加金币
class DiamondPlains extends TitleDecrator {
function getJinbi () {
return $this->title->getJinbi() + 2;
}
}
//如果被污染则减少金币
class PulltedPlains extends TitleDecrator {
function getJinbi () {
return $this->title->getJinbi()getJinbi() - 4;
}
}
这样我们可以计算单独计算占领后、有钻石和被污染的金币,重要的是可以计算总的金币数
$obj = new PulltedPlains( new DiamondPlains( new Plains() ) );
从最里面Plains()计算占领得金币数、往外计算DiamondPlains钻石加成 最后PulltedPlains污染减分。