<?php abstract class mobile{ abstract public function getinfo(); abstract public function getprice(); } class iphone extends mobile{ private $price=4999; private $info='官方标配(手机+电源+数据线+耳机)'; public function getinfo(){ return $this->info; } public function getprice(){ return $this->price; } } class bareiphone extends iphone{ private $info='裸机(手机)'; public function getinfo(){ return $this->info; } public function getprice(){ return parent::getprice()-200; } } class fullsetiphone extends iphone{ private $info='套装(手机+电源+数据线+耳机+手机壳+贴膜+移动电源)'; public function getinfo(){ return $this->info; } public function getprice(){ return parent::getprice()+100; } } class lumia920 extends mobile{ private $price=4399; private $info='官方标配(手机+电源+数据线+耳机)'; public function getinfo(){ return $this->info; } public function getprice(){ return $this->price; } } class barelumia920 extends lumia920{ private $info='裸机(手机)'; public function getinfo(){ return $this->info; } public function getprice(){ return parent::getprice()-200; } } class fullsetlumia920 extends lumia920{ private $info='套装(手机+电源+数据线+耳机+手机壳+贴膜+移动电源)'; public function getinfo(){ return $this->info; } public function getprice(){ return parent::getprice()+100; } } $iphone=new fullsetiphone(); echo 'iphone全套配置价格为:'.$iphone->getprice().',配置为:'.$iphone->getinfo(); echo '<br>'; $lumia920=new barelumia920(); echo 'lumia920全套配置价格为:'.$lumia920->getprice().',配置为:'.$lumia920->getinfo(); ?>
我们为iphone和lumia920分别设置了三种套餐,但观察一下可以发现,iphone和lumia920的bare方法和fullset方法完全一样的,这造成了一种耦合,我们完全可以将bare方法和fullset方法分离出来,这就需要装饰模式,代码如下:
<?php abstract class mobile{ abstract public function getinfo(); abstract public function getprice(); } class iphone extends mobile{ private $price=4999; private $info='官方标配(手机+电源+数据线+耳机)'; public function getinfo(){ return $this->info; } public function getprice(){ return $this->price; } } class lumia920 extends mobile{ private $price=4399; private $info='官方标配(手机+电源+数据线+耳机)'; public function getinfo(){ return $this->info; } public function getprice(){ return $this->price; } } //装饰类 abstract class decorateiphone extends mobile{ protected $iphone; public function __construct(mobile $iphone){ $this->iphone=$iphone; } } class bare extends decorateiphone{ private $info='裸机(手机)'; public function getinfo(){ return $this->info; } public function getprice(){ return $this->iphone->getprice()-200; } } class fullset extends decorateiphone{ private $info='套装(手机+电源+数据线+耳机+手机壳+贴膜+移动电源)'; public function getinfo(){ return $this->info; } public function getprice(){ return $this->iphone->getprice()+100; } } $iphone=new fullset(new iphone()); echo 'iphone全套配置价格为:'.$iphone->getprice().',配置为:'.$iphone->getinfo(); echo '<br>'; $lumia920=new bare(new lumia920()); echo 'lumia920裸机价格为:'.$lumia920->getprice().',配置为:'.$lumia920->getinfo(); ?>
以上就是php面向对象开发之——装饰模式的内容。
