4.例子
23種設計模式
(來自w3cschool,如有需要,聯絡刪除)
首先,什麼是介面透明?
介面透明是指被裝飾物被裝飾物裝飾後,被裝飾物本身不發生任何變化,其介面或者方法仍可以被外界呼叫,與未裝飾之前無改變。
其實我們不管如何的使用裝飾器模式,有乙個點不會變,那就是裝飾器模式的本質是被裝飾物,裝飾物裝飾被裝飾物是為了突出被裝飾物。有點繞口,可以這麼理解:
你家裡買了新房子,裝修是為了好看。但是不管如何裝修,有乙個共同的目的:房子好看舒服。。。。。
但是,本質上乙個房子好看,舒服,以及其他的要求,應該是對房子主體提出的要求,但是我們通過裝修實現。這樣就完成了乙個委託。
把對房子的要求委託給裝修。
即,被裝飾物需要實現的功能,通過裝飾器模式委託給裝飾物。
因為抽象的裝飾物必須與裝飾物裝飾的被裝飾物的型別繫結,說的簡單一點,床放在臥室,沙發放在客廳一樣。
抽象的裝飾物通過持有抽象的被裝飾物,而這個抽象的被裝飾物可以看做乙個型別,當型別沒有限制,就是所有的被裝飾物。
抽象的裝飾物一方面持有抽象的被裝飾物,另一方面具體的裝飾物和具體的被裝飾物擁有相同的方法,所以,呼叫具體的裝飾物的方法會遞迴呼叫所有引數本次構造的具體的裝飾物,具體的被裝飾物的方法。
打個比方:
有a,b兩個類,現在需要a實現乙個do方法,但是a不想實現do方法,於是委託給b,讓b去實現:
a.do
(這不是真正的程式設計語法,只是舉個例子)
b.do
這樣可以看出,a把do方法委託給了b
前提條件就是a可以訪問b的do方法,或者a持有b的例項。
a與b之間是弱關聯。
這是通過直接關聯實現委託。
還有間接關聯實現委託。
首先,我們觀察直接關聯實現委託,發現a和b類中有乙個共同點:
都有do方法,且方法申明完全相同。
那麼就可以把這部分抽象出乙個介面或者抽象類
然後讓a和b繼承於或者實現介面或者抽象類
然後讓委託類持有基類的物件呼叫抽象的方法。
比較:間接委託實現一對多委託,動態委託
直接委託只能實現一對一委託
專案的結構:
說明:client中使用裝飾物或者被裝飾物的類
compoment中是被裝飾物
decorator中是裝飾物
abs中是抽象
impl中是實現
下面的**中注意包結構
package decorator.component.abs;
/** * 被裝飾物的抽象,如果有抽象出的屬性,使用抽象類
* */
public inte***ce house
package decorator.component.impl;
import cn.com.startimes.decorator.component.abs.house;
/** * 具體的被裝飾物--大房子
* */
public class bighouse implements house
}
package decorator.decorator.abs;
import cn.com.startimes.decorator.component.abs.house;
/** * 抽象的裝飾物--家具
* */
public abstract class furniture implements house
@override
public abstract void say();
}
package decorator.decorator.impl;
import cn.com.startimes.decorator.component.abs.house;
import cn.com.startimes.decorator.decorator.abs.furniture;
/** * 具體的裝飾物----家具
* */
public class bed extends furniture
@override
public void say()
}
package decorator.client;
import cn.com.startimes.decorator.component.abs.house;
import cn.com.startimes.decorator.component.impl.bighouse;
import cn.com.startimes.decorator.decorator.impl.bed;
import cn.com.startimes.decorator.decorator.impl.chair;
public class main
}
house:
我是大房子
bed:
我是大房子
我是家具--床
package decorator.decorator.impl;
import cn.com.startimes.decorator.component.abs.house;
import cn.com.startimes.decorator.decorator.abs.furniture;
public class chair extends furniture
@override
public void say()
}
package decorator.client;
import cn.com.startimes.decorator.component.abs.house;
import cn.com.startimes.decorator.component.impl.bighouse;
import cn.com.startimes.decorator.decorator.impl.bed;
import cn.com.startimes.decorator.decorator.impl.chair;
public class main
}
house:
我是大房子
bed:
我是大房子
我是家具--床
chairforhouse:
我是大房子
我是家具--床
我是家具--椅子
chairforbed:
我是大房子
我是家具--床
我是家具--床
我是家具--椅子
chairforchair:
我是大房子
我是家具--床
我是家具--椅子
我是家具--椅子
bighouse:
我是大房子
說明:
house -------- bed ------委託+透明
chairforhouse --------- chairforbed ------- 遞迴+委託+透明(遞迴bed)
chairforhouse --------- chairforchar--------遞迴+委託+透明(遞迴chair)
bighouse---------透明性
23種設計模式
結構型設計模式 裝飾器模式
說明 裝飾器模式 decorator pattern 允許 向乙個現有的物件新增新的功能,同時又不改變其結構 這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。實現方法 1.新建乙個介面 pu...
23種設計模式 裝飾器模式
7.應用場景 8.現實案例 9.注意事項 某些情況,當乙個類已經存在,並且可以對外提供核心功能時,但是,某個時刻,希望對這個類進行功能增強 如 增加快取 通常情況,我們可以修改原來的類,並增加對應的增強功能即可 但是,這種方式違背了 開 閉 原則,需要修改原來的 而且不夠靈活,如果有某個時刻又不想使...
結構型設計模式 裝飾模式
裝飾模式動態地給乙個物件新增一些額外的職責,就增加功能來說,它比生成子類更靈活。也可以這樣說,裝飾模式把複雜類中的核心職責和裝飾功能區分開了,這樣既簡化了複雜類,有去除了相關類中重複的裝飾邏輯。裝飾模式沒有通過繼承原有類來擴充套件功能,但卻達到了一樣的目的,而且比繼承更加靈活,所以可以說裝飾模式是繼...