免費(fèi)搭網(wǎng)站常州seo第一人
模式定義
動(dòng)態(tài)地給對(duì)象增加額外的職責(zé)
- 對(duì)象結(jié)構(gòu)型模式
模式結(jié)構(gòu)
- Component:抽象構(gòu)件
- ConcreteComponent: 具體構(gòu)件
- Decorator:抽象裝飾類(lèi)
- ConcreteDecorator: 具體裝飾類(lèi)
抽象裝飾類(lèi)代碼
public class Decorator extends Component {private Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}}
具體裝飾類(lèi)代碼
public class ConcreteDecorator extends Decorator {Object addedState; // 新增屬性public ConcreteDecorator(Component component) {super(component);}public void operation() {super.operation();addedBehavior();}// 新增方法public void addedBehavior() {// do something}}
- 一個(gè)裝飾類(lèi)的接口必須與被裝飾類(lèi)的接口保持相同
- 對(duì)于客戶(hù)端來(lái)說(shuō)無(wú)論是裝飾之前的對(duì)象還是裝飾之后的對(duì)象都可以一致對(duì)待
- 盡量保持具體構(gòu)件類(lèi)Component作為一個(gè)“輕”類(lèi)
- 不要把太多的邏輯和狀態(tài)放在具體構(gòu)件類(lèi)中可以通過(guò)裝飾類(lèi)對(duì)其進(jìn)行擴(kuò)展
簡(jiǎn)化裝飾模式
如果只有一個(gè)具體構(gòu)件類(lèi)而沒(méi)有抽象構(gòu)件類(lèi),那么抽象裝飾類(lèi)可以作為具體構(gòu)件類(lèi)的直接子類(lèi)
透明裝飾模式
客戶(hù)端完全面向抽象編程
- 客戶(hù)端不聲明具體構(gòu)件類(lèi)型和具體裝飾類(lèi)型,而全部聲明為抽象構(gòu)件類(lèi)型
半透明裝飾模式
客戶(hù)端面向抽象構(gòu)件類(lèi)型和具體裝飾類(lèi)型編程
- 客戶(hù)端可以聲明具體裝飾者類(lèi)型對(duì)象,調(diào)用具體裝飾者中新增方法
實(shí)例
某系統(tǒng)提供了一個(gè)數(shù)據(jù)加密功能,可以對(duì)字符串進(jìn)行加密。最簡(jiǎn)單的加密算法通過(guò)對(duì)字母進(jìn)行移位來(lái)實(shí)現(xiàn),同時(shí)還提供了稍復(fù)雜的逆向輸出加密,還提供了更為高級(jí)的求模加密。用戶(hù)先使用最簡(jiǎn)單的加密算法對(duì)字符串進(jìn)行加密,如果覺(jué)得還不夠可以對(duì)加密之后的結(jié)果使用其他加密算法進(jìn)行二次加密,當(dāng)然也可以進(jìn)行第三次加密?,F(xiàn)使用裝飾模式設(shè)計(jì)該多重加密系統(tǒng)。
模式分析
- 優(yōu)點(diǎn)
- 提供比繼承更多的靈活性以擴(kuò)展對(duì)象功能
- 通過(guò)配置文件在運(yùn)行時(shí)選擇不同的裝飾器以動(dòng)態(tài)擴(kuò)展對(duì)象功能
- 具體構(gòu)件類(lèi)和具體裝飾類(lèi)可以獨(dú)立變化
- 符合開(kāi)閉原則
- 缺點(diǎn)
- 增加系統(tǒng)的復(fù)雜度
- 比繼承更加易于出錯(cuò),排錯(cuò)困難
適用環(huán)境
- 在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)
- 需要?jiǎng)討B(tài)地給一個(gè)對(duì)象增加功能,這些功能也可以動(dòng)態(tài)地被撤銷(xiāo)
- 當(dāng)不能采用繼承的方式對(duì)系統(tǒng)進(jìn)行擴(kuò)充或者采用繼承不利于系統(tǒng)擴(kuò)展和維護(hù)時(shí)
- 系統(tǒng)中存在大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類(lèi),使得子類(lèi)數(shù)目呈爆炸性增長(zhǎng)
- 不能繼承的類(lèi)定義(如final類(lèi))