在網路上買過手機的朋友都知道,商家通常會為手機搭配好幾個套餐,讓客戶自由選擇,現在有一家賣手機的店,為所有手機推出了三種套餐,標準套餐為4999元,裸機標準套餐減200元,全套配置為標準套餐加100元,我們用php將實現。
<?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物件導向開發之-裝飾模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!