[Java性能優(yōu)化筆記]06 裝飾者模式

裝飾者模式擁有一種非常巧妙的結(jié)構(gòu),它可以動態(tài)添加對象功能藏研。
它使用委托機制,降低代碼的耦合性背率,復(fù)用系統(tǒng)中的各個組件卒落,使得我們最終構(gòu)造的對象具有這些所有功能羡铲。

裝飾者模式可以有效的分離性能組件和功能組件,從而提升模塊的可維護性并增加模塊的復(fù)用性儡毕。

裝飾者(Decorator)和被裝飾者(ConcreteComponent)擁有相同的接口Component也切。
被裝飾者通常是系統(tǒng)的核心組件,完成特定的功能目標(biāo)腰湾。而裝飾者則可以在被裝飾者的方法前后加上特定的前置處理或者后置處理雷恃,
增強被裝飾者功能。

下面舉例說明:

需求:我們需要將一個內(nèi)容以HTML的方式發(fā)布檐盟。

  • 需要將內(nèi)容轉(zhuǎn)換成HTML文本
  • 增加HTML頭
  • 增加HTTP頭

首先褂萧,我們定義一個組件接口,它的主要功能就是對內(nèi)容進(jìn)行處理葵萎。

public interface IPacketCreator {
    public String handleContent();
}

PacketCreator用于返回數(shù)據(jù)包的核心數(shù)據(jù):

public class PacketBodyCreator implements IPacketCreator {

    @Override
    public String handleContent() {
        return "Content of Body";
    }
}

PacketDecorator對組件進(jìn)行維護导犹, 它并不實現(xiàn)業(yè)務(wù)邏輯唱凯,僅僅給子類提供一個委托對象。

public abstract class PacketDecorator implements IPacketCreator {
    IPacketCreator component;

    public PacketDecorator(IPacketCreator creator) {
        this.component = creator;
    }
}

下面是具體組件的實現(xiàn):

public class PacketHtmlHeaderCreator extends PacketDecorator {

    public PacketHtmlHeaderCreator(IPacketCreator creator) {
        super(creator);
    }

    @Override
    public String handleContent() {
        StringBuilder sb = new StringBuilder();
        sb.append("<html>");
        sb.append("<body>");
        sb.append(component.handleContent());
        sb.append("</body>");
        sb.append("</html>");
        return sb.toString();
    }
}


public class PacketHTTPHeaderCreator extends PacketDecorator{

    public PacketHTTPHeaderCreator(IPacketCreator creator) {
        super(creator);
    }

    @Override
    public String handleContent() {
        StringBuffer sb = new StringBuffer();
        sb.append("CacheControl:no-cache\n");
        sb.append("Date:Sun,21June201515:58:57GMT\n");
        sb.append(component.handleContent());
        return sb.toString();
    }
}

測試:

public class DecoratorTester {
    public static void main(String[] args) {
        IPacketCreator pc = new PacketHTTPHeaderCreator(
                new PacketHtmlHeaderCreator(new PacketBodyCreator()));
        System.out.println(pc.handleContent());
    }
}

從例子中我們可以看出谎痢,組件的各種功能最后被一層層的嵌入最終的pc中磕昼。

其實裝飾者模式在日常使用中也很常見,比如JDK中的IO Stream:

DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("/data/file.txt")));

于2015-06-21

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末节猿,一起剝皮案震驚了整個濱河市票从,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滨嘱,老刑警劉巖峰鄙,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異太雨,居然都是意外死亡吟榴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門囊扳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吩翻,“玉大人,你說我怎么就攤上這事锥咸∠料梗” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵搏予,是天一觀的道長熊锭。 經(jīng)常有香客問我,道長缔刹,這世上最難降的妖魔是什么球涛? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任劣针,我火速辦了婚禮校镐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捺典。我一直安慰自己鸟廓,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布襟己。 她就那樣靜靜地躺著引谜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擎浴。 梳的紋絲不亂的頭發(fā)上员咽,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音贮预,去河邊找鬼贝室。 笑死契讲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滑频。 我是一名探鬼主播捡偏,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峡迷!你這毒婦竟也來了银伟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤绘搞,失蹤者是張志新(化名)和其女友劉穎彤避,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夯辖,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡忠藤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了楼雹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片模孩。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贮缅,靈堂內(nèi)的尸體忽然破棺而出榨咐,到底是詐尸還是另有隱情,我是刑警寧澤谴供,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布块茁,位于F島的核電站,受9級特大地震影響桂肌,放射性物質(zhì)發(fā)生泄漏数焊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一崎场、第九天 我趴在偏房一處隱蔽的房頂上張望佩耳。 院中可真熱鬧,春花似錦谭跨、人聲如沸干厚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛮瞄。三九已至,卻和暖如春谆扎,著一層夾襖步出監(jiān)牢的瞬間挂捅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工堂湖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闲先,地道東北人周瞎。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像饵蒂,于是被迫代替她去往敵國和親声诸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容