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

好了,昨天我們說(shuō)完了單利模式,趁著現(xiàn)在想寫(xiě)博客就多寫(xiě)幾篇吧.

下面開(kāi)始說(shuō)這個(gè)裝飾模式


裝飾模式其實(shí)還有做成一個(gè)類,一個(gè)類的不斷的繼承,從而實(shí)現(xiàn)功能(裝飾)的加強(qiáng),不過(guò)這樣做太復(fù)雜,

同時(shí)耦合性太高,為了加一次功能就需要一個(gè)新類繼承一次.

我們要不斷的往餅上加肉或者加蛋的,畢竟加了肉和蛋更好吃.哈哈

代碼如下:

//一個(gè)餅的抽閑類abstract class?Bing{


public abstract?double?price();//價(jià)格

?public abstract?String name();//名字

?public void?product(){


System.out.println("生產(chǎn)的餅,名字是"+name()+",價(jià)格是"+price());


}

}


//炊餅class ChuiBing extends Bing {

??? @Override

??? public double price() {

??????? return 1.0;

??? }@Override

??? public String name() {

??????? return "炊餅";

??? }}


//老婆餅class LaopaoBing extends Bing {

??? @Override

??? public double price() {

??????? return 2.6;

??? }@Override

??? public String name() {

??????? return "老婆餅";

??? }}


下面就開(kāi)始給炊餅加蛋了

//炊餅加個(gè)蛋,記為炊餅1class Egg1 extends ChuiBing{

??? //加個(gè)在原來(lái)的基礎(chǔ)上1

??? @Override

??? public double price() {

??????? return super.price()+1.0;

??? }@Override

??? public String name() {

??????? return super.name()+"加了蛋";

??? }}


老板,再加個(gè)蛋

//炊餅1上繼續(xù)加蛋,只能繼續(xù)繼承炊餅1class Egg2 extends Egg1{

??? //加個(gè)在原來(lái)的基礎(chǔ)上1

??? @Override

??? public double price() {

??????? return super.price()+1.0;

??? }@Override

??? public String name() {

??????? return super.name()+"加了蛋";

??? }}


如果再繼續(xù)加肉的話,需要繼續(xù)往上繼承,非常的復(fù)雜.以后的維護(hù)非常的困難.


而如果我們使用裝飾模式,就能夠很方便的添加新的功能(裝飾),得到很多加了肉又加了單的餅了.


//加個(gè)雞蛋的裝飾類class EggDecorate extends Bing{

??? private? Bing b;

??? public EggDecorate(Bing b) {

??????? this.b = b;

??? }@Override

??? public double price() {

?????? return b.price()+0.5;

??? }@Override

??? public String name() {

???? return b.name()+"加了個(gè)雞蛋";

??? }}



//加肉的裝飾類class MeatDecorate extends? Bing{

??? private? Bing b;

??? public MeatDecorate(Bing b) {

??????? this.b = b;

??? }@Override

??? public double price() {

??? return b.price()+1.0;

??? }@Override

??? public String name() {

??????? return b.name()+"加了肉";

??? }}


//測(cè)試方法

public static void main(String[] args){

??? //使用加蛋的來(lái)裝飾炊餅??? EggDecorate ed=new EggDecorate(new ChuiBing());

??? ed.product();//繼續(xù)使用加蛋,來(lái)裝飾剛才的對(duì)象??? EggDecorate decorate = new EggDecorate(ed);

??? decorate.product();}


通過(guò)這種方法,我們就能夠隨意的進(jìn)行裝飾了,得到解耦合的目的,同時(shí),維護(hù)一起也會(huì)更加的方便.


裝飾模式的關(guān)鍵是裝飾類持有基類的對(duì)象,同時(shí)繼承基類,在構(gòu)造函數(shù)中進(jìn)行初始化,表示要進(jìn)行裝飾的對(duì)象,對(duì)這個(gè)對(duì)象進(jìn)行裝飾,繼承基類,就能夠進(jìn)行方法的重寫(xiě),外面就是調(diào)用重寫(xiě)過(guò)的方法,而外面的外用沒(méi)有任何的感覺(jué).


我們只需要對(duì)這個(gè)對(duì)象在原來(lái)的基礎(chǔ)上直接進(jìn)行添加新的裝飾就可以了.從整體上看解耦,同時(shí)也沒(méi)有改變?cè)瓉?lái)對(duì)象

的方法,有點(diǎn)像切面.


關(guān)于裝飾模式,在java的IO中有很好的使用,官方封裝的非常好.

這是java 的IO的部分,下面的BufferedInputStream 就是一個(gè)常用的讀取的緩存包裝類,其構(gòu)造函數(shù)中需要InputStream? 這是讀入的基類,相當(dāng)于上面的Bing,所以能夠?qū)ζ渌囊恍┬枰淖宇愡M(jìn)行包裝.


這就是我的一點(diǎn)理解,如有錯(cuò)誤,請(qǐng)指正.謝謝

2017年8月21日19:33:48

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仁期,更是在濱河造成了極大的恐慌狂巢,老刑警劉巖撑蚌,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乒躺,死亡現(xiàn)場(chǎng)離奇詭異近速,居然都是意外死亡科展,警方通過(guò)查閱死者的電腦和手機(jī)均牢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)才睹,“玉大人徘跪,你說(shuō)我怎么就攤上這事±湃粒” “怎么了垮庐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坞琴。 經(jīng)常有香客問(wèn)我哨查,道長(zhǎng),這世上最難降的妖魔是什么剧辐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任寒亥,我火速辦了婚禮,結(jié)果婚禮上荧关,老公的妹妹穿的比我還像新娘溉奕。我一直安慰自己,他們只是感情好忍啤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布加勤。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胸竞。 梳的紋絲不亂的頭發(fā)上欺嗤,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音卫枝,去河邊找鬼煎饼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛校赤,可吹牛的內(nèi)容都是我干的吆玖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼马篮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沾乘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起浑测,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翅阵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后迁央,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掷匠,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年岖圈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讹语。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜂科,死狀恐怖顽决,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情导匣,我是刑警寧澤才菠,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贡定,受9級(jí)特大地震影響鸠儿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厕氨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汹粤。 院中可真熱鬧命斧,春花似錦、人聲如沸嘱兼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至汇四,卻和暖如春接奈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背通孽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工序宦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人背苦。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓互捌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親行剂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秕噪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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