最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP設(shè)計(jì)模式之裝飾者模式

 更新時(shí)間:2012年02月29日 00:03:19   作者:  
裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案
介紹
裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。

思維導(dǎo)圖

裝飾者模式

 

有這樣一個(gè)項(xiàng)目,做一個(gè)餐廳訂餐系統(tǒng)。起初的代碼結(jié)構(gòu)是這樣的。前面有很多Beverage的繼承類,現(xiàn)在遇到的問題是牛奶的價(jià)錢上漲了,那么所有相關(guān)的類,我們都要進(jìn)行調(diào)整,比如Milk,SugarAndMilk類,這種類還有很多,我們需要逐個(gè)去修改類中的方法——開發(fā)人員每次都做這種事情,要瘋了!所以我們要改變現(xiàn)有的結(jié)構(gòu)。以下的圖都是簡(jiǎn)圖,實(shí)際的圖,可沒有這么簡(jiǎn)單。

 

 

 設(shè)計(jì)問題:

1》類數(shù)量爆炸,有很多類,難以維護(hù);
2》整個(gè)設(shè)計(jì)呆板;
3》基類加入的新功能無法使用于子類;
復(fù)用類方法的方式很多,比如繼承,組合,委托。為什么老是習(xí)慣用繼承呢?我看Zend Framework也有這種習(xí)慣!每次找對(duì)應(yīng)方法,一直往上翻。——題外話!!!!
后來經(jīng)過小組研究決定,我們決定把基礎(chǔ)類抽出來,比如,我們把咖啡做成一個(gè)單獨(dú)的類,其他的咖啡,比如牛奶咖啡,甜味咖啡,我們只對(duì)材料單獨(dú)包裝成一個(gè)類。
經(jīng)過改良的設(shè)計(jì):

詳解
1》對(duì)于飲品,我們直接繼承Beverage類,直接把報(bào)價(jià)寫進(jìn)飲品類里面;
2》而對(duì)于一些需要添加調(diào)味品的特殊飲品,我們做累加操作。比如,我想要杯奶咖啡,則 總價(jià)=咖啡價(jià)+奶價(jià)
3》這樣不同的飲料就很容易知道它的價(jià)格。
代碼

復(fù)制代碼 代碼如下:

<?php
abstract class Beverage{
public $_name;
abstract public function Cost();
}
// 被裝飾者類
class Coffee extends Beverage{
public function __construct(){
$this->_name = 'Coffee';
}
public function Cost(){
return 1.00;
}
}
// 以下三個(gè)類是裝飾者相關(guān)類
class CondimentDecorator extends Beverage{
public function __construct(){
$this->_name = 'Condiment';
}
public function Cost(){
return 0.1;
}
}
class Milk extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Milk';
if($beverage instanceof Beverage){
$this->_beverage = $beverage;
}else
exit('Failure');
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
class Sugar extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Sugar';
if($beverage instanceof Beverage){
$this->_beverage = $beverage;
}else{
exit('Failure');
}
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
// Test Case
//1.拿杯咖啡
$coffee = new Coffee();
//2.加點(diǎn)牛奶
$coffee = new Milk($coffee);
//3.加點(diǎn)糖
$coffee = new Sugar($coffee);
printf("Coffee Total:%0.2f元\n",$coffee->Cost());

總結(jié)
1.裝飾者(Milk)和被裝飾者(Coffee)必須是一樣的類型。目的是裝飾者必須取代被裝飾者。
2.添加行為:當(dāng)裝飾者和組件組合時(shí),就是在加入新的行為。
題外話:
1.利用繼承設(shè)計(jì)子類行為,是在編譯時(shí)靜態(tài)決定的,而且所有的子類都會(huì)繼承到相同的行為。打個(gè)比方,老子想學(xué)點(diǎn)功夫,看你小子會(huì)太極拳,老子只需要繼承你一下 ,老子也就會(huì)太極拳了——呵呵,這時(shí)老子就變成你兒子了,看來繼承是要付出代價(jià)的。
2.組合,我們可以擴(kuò)展對(duì)象的行為,在運(yùn)行時(shí)動(dòng)態(tài)地進(jìn)行擴(kuò)展。利用組合我們可以隨時(shí)把我們當(dāng)時(shí)設(shè)計(jì)超類時(shí)沒有想到的方法加入到對(duì)象中,而不用改變現(xiàn)有的代碼。打個(gè)比方,老子現(xiàn)在沒有內(nèi)力,吸功大法,把和尚,尼姑,道士的內(nèi)力(行為對(duì)象)都吸過來,那在搏斗(運(yùn)行時(shí))中,老子可以隨時(shí)都能使用不同的內(nèi)力,但也不能胡亂吸內(nèi)力,否則你就要走火入魔了!
3.類應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。如果我們每個(gè)部分都用裝飾者模式進(jìn)行設(shè)計(jì),那么對(duì)于整個(gè)框架來說有點(diǎn)浪費(fèi),而且你也加大了代碼的難度。那什么時(shí)候使用這種模式呢?我們一般用于經(jīng)常改變的地方。那我們又怎么知道哪些是經(jīng)常改變的地方呢?這個(gè)就需要我們的經(jīng)驗(yàn)和你對(duì)所處行業(yè)的了解。建議大家平時(shí)多看點(diǎn)例子。
4.裝飾模式為設(shè)計(jì)注入彈性,但同時(shí)會(huì)在設(shè)計(jì)中加入大量的小類,這偶爾會(huì)導(dǎo)致別人不容易了解這種設(shè)計(jì)。
5.在使用裝飾者模式的時(shí)候,對(duì)插入的的裝飾者要特別小心。因?yàn)檠b飾者模式依賴某種特定的類型(Beverage)。
6.要想很好的使用裝飾者模式,我們還要配合使用工廠模式和生成器模式,但今天只說裝飾者模式。要想知道更多,請(qǐng)聽下回分解。
參考文獻(xiàn):《head first 設(shè)計(jì)模式》

相關(guān)文章

  • 分析Composer實(shí)現(xiàn)自動(dòng)加載原理

    分析Composer實(shí)現(xiàn)自動(dòng)加載原理

    一般在框架中都會(huì)用到composer工具, 用它來管理依賴。其中 composer有類的自動(dòng)加載機(jī)制,可以加載composer下載的庫中的所有的類文件。那么composer的自動(dòng)加載機(jī)制是怎么實(shí)現(xiàn)的呢?
    2021-05-05
  • PHP識(shí)別二維碼的方法(php-zbarcode安裝與使用)

    PHP識(shí)別二維碼的方法(php-zbarcode安裝與使用)

    這篇文章主要介紹了PHP識(shí)別二維碼的方法,通過安裝ImageMagick和php-zbarcode擴(kuò)展實(shí)現(xiàn)針對(duì)二維碼的識(shí)別功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • PHP行為型模式之責(zé)任鏈模式

    PHP行為型模式之責(zé)任鏈模式

    責(zé)任鏈模式,其目的是組織一個(gè)對(duì)象鏈處理一個(gè)如方法調(diào)用的請(qǐng)求。當(dāng)ConcreteHandler(具體的處理程序)不知道如何滿足來自Client的請(qǐng)求時(shí),或它的目的不是這個(gè)時(shí),它會(huì)委派給鏈中的下一個(gè)Handler(處理程序)來處理
    2023-04-04
  • php輕量級(jí)的性能分析工具xhprof的安裝使用

    php輕量級(jí)的性能分析工具xhprof的安裝使用

    之前一直使用基于Xdebug進(jìn)行PHP的性能分析,對(duì)于本地開發(fā)環(huán)境來說是夠用了,但如果是線上環(huán)境的話,xdebug消耗較大,配置也不夠靈活,因此線上環(huán)境建議使用xhprof進(jìn)行PHP性能追蹤及分析。
    2015-08-08
  • WordPress中調(diào)試縮略圖的相關(guān)PHP函數(shù)使用解析

    WordPress中調(diào)試縮略圖的相關(guān)PHP函數(shù)使用解析

    這篇文章主要介紹了WordPress中調(diào)試縮略圖的相關(guān)PHP函數(shù)使用解析,包括使用set_post_thumbnail_size來調(diào)整縮略圖的大小,需要的朋友可以參考下
    2016-01-01
  • 強(qiáng)烈聲明: 不要使用(include/require)_once

    強(qiáng)烈聲明: 不要使用(include/require)_once

    本篇文章是對(duì)不要使用(include/require)_once的原因進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • php在linux下檢測(cè)mysql同步狀態(tài)的方法

    php在linux下檢測(cè)mysql同步狀態(tài)的方法

    這篇文章主要介紹了php在linux下檢測(cè)mysql同步狀態(tài)的方法,是Linux下使用php檢測(cè)mysql同步狀態(tài)的實(shí)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • PHP基礎(chǔ)知識(shí)詳細(xì)講解

    PHP基礎(chǔ)知識(shí)詳細(xì)講解

    PHP是安全中需要掌握的一門語言,就這么一點(diǎn)兒時(shí)間教網(wǎng)絡(luò)安全,不可能精通,這里就不要求你精通PHP,但是對(duì)于一些基礎(chǔ)代碼能夠認(rèn)識(shí)、能夠編寫那么就可以了
    2022-12-12
  • 超強(qiáng)多功能php綠色集成環(huán)境詳解

    超強(qiáng)多功能php綠色集成環(huán)境詳解

    本文主要介紹了超強(qiáng)多功能php綠色集成環(huán)境,文中所使用的是PHPWAMP這款綠色的集成環(huán)境,集成VC運(yùn)行庫。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • PHP 偽靜態(tài)技術(shù)原理以及突破原理實(shí)現(xiàn)介紹

    PHP 偽靜態(tài)技術(shù)原理以及突破原理實(shí)現(xiàn)介紹

    偽靜態(tài)技術(shù)比較好突破,需要自己構(gòu)造中轉(zhuǎn)注入頁面;偽靜態(tài)技術(shù)原理都很簡(jiǎn)單,就是把原來的 index.php?id=1 這種形式的URL給替換成其它形式
    2013-07-07

最新評(píng)論

马鞍山市| 利津县| 郁南县| 黄山市| 自治县| 开江县| 嘉黎县| 通海县| 浮山县| 调兵山市| 福鼎市| 蓬莱市| 神农架林区| 清河县| 连南| 通城县| 紫阳县| 镇安县| 乐陵市| 海城市| 册亨县| 陆良县| 广德县| 酒泉市| 浦城县| 宜川县| 菏泽市| 买车| 仙桃市| 阳城县| 江门市| 石林| 莱芜市| 阿拉善右旗| 右玉县| 龙口市| 宣威市| 板桥市| 宝山区| 泰和县| 连平县|