這兩個(gè)設(shè)計(jì)模式看起來(lái)很像:對(duì)裝飾器模式來(lái)說(shuō),裝飾者(decorator)和被裝飾者(decoratee)都實(shí)現(xiàn)同一個(gè)接口。對(duì)代理模式來(lái)說(shuō)它浅,代理類(proxy class)和真實(shí)處理的類(real class)都實(shí)現(xiàn)同一個(gè)接口
實(shí)際上拌消,在裝飾器模式和代理模式之間還是有很多差別的
裝飾器模式偏重對(duì)原對(duì)象功能的擴(kuò)展,擴(kuò)展后的對(duì)象仍是是對(duì)象本身酗失;然而代理模式偏重因自己無(wú)法完成或無(wú)需關(guān)心义钉,需要他人干涉事件流程,更多的是對(duì)對(duì)象的控制(代理使客戶端不需要知道實(shí)現(xiàn)類是什么规肴,怎么做的捶闸,而客戶端只需知道代理即可,即將客戶端與實(shí)現(xiàn)類解耦)
換句話說(shuō)拖刃,用代理模式删壮,代理類(proxy class)可以對(duì)它的客戶隱藏一個(gè)對(duì)象的具體信息。因此兑牡,當(dāng)使用代理模式的時(shí)候央碟,我們常常在一個(gè)代理類中創(chuàng)建一個(gè)對(duì)象的實(shí)例。并且均函,當(dāng)我們使用裝飾器模式的時(shí)候亿虽,我們通常的做法是將原始對(duì)象作為一個(gè)參數(shù)傳給裝飾者的構(gòu)造器
一句話總結(jié)這些差別:使用代理模式,代理和真實(shí)對(duì)象之間的的關(guān)系通常在編譯時(shí)就已經(jīng)確定了苞也,而裝飾者能夠在運(yùn)行時(shí)遞歸地被構(gòu)造
//代理模式
public class Proxy implements Subject {
private Subject subject;
public Proxy() {
//關(guān)系在編譯時(shí)確定
subject = new RealSubject();
}
public void doAction() {
….
subject.doAction();
….
}
}
//代理的客戶
public class Client {
public static void main(String[] args){
// 客戶不知道代理委托了另一個(gè)對(duì)象
Subject subject = new Proxy();
…
}
}
//裝飾器模式
public class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component
}
public void operation() {
…
component.operation();
…
}
}
//裝飾器的客戶
public class Client {
public static void main(String[] args) {
// 客戶指定了裝飾者需要裝飾的是哪一個(gè)類
Component component = new Decorator(new ConcreteComponent());
…
}
}