代理模式
代理模式就是,買房子得通過中介泊愧,打官司需要請(qǐng)律師伊磺,打怪獸找奧特曼。
上代碼:
//一個(gè)加法計(jì)算器的接口
public interface ICalculator {
public int add(int a, int b);
}
//定義計(jì)算器類删咱,實(shí)現(xiàn)此接口
public class CalculatorImpl implements ICalculator {
@Override
public int add(int a, int b) {
return a + b;
}
}
//代理類
public class MyProxy implements ICalculator {
ICalculator iCalculator = null;
public MyProxy() {
this.iCalculator = new CalculatorImpl();
}
@Override
public int add(int a, int b) {
//增加代碼屑埋,對(duì)輸入做一些處理
doSthBefore();
int result = iCalculator.add(a, b);
//增加代碼,對(duì)結(jié)果做一些處理
doSthAfter();
return result;
}
private void doSthBefore() {
}
private void doSthAfter() {
}
}
//調(diào)用代碼
ICalculator iCalculator = new MyProxy();
iCalculator.add(5, 6);
幾個(gè)需要注意的點(diǎn):
- 代理類(MyProxy)與被代理類(CalculatorImpl)要實(shí)現(xiàn)同一個(gè)接口(ICalculator)
- 代理類包含有被代理類的對(duì)象腋腮,因?yàn)楦蓪?shí)事的時(shí)候還是要靠這個(gè)對(duì)象的雀彼。
- 代理類可以在被代理類真正“工作”之前和之后做一些必要操作(doSthBefore()和doSthAfter())壤蚜。
你要買90平的房子,但房源都是60平的戶型徊哑,中介是不會(huì)通知你看房的袜刷,這是doSthBefore();有了90的戶型莺丑,但著蟹,賣方要價(jià)遠(yuǎn)遠(yuǎn)超出你的報(bào)價(jià),中介同樣不會(huì)通知你看房的梢莽,這就是doSthAfter()萧豆。
裝飾模式
裝飾模式通常用來動(dòng)態(tài)的擴(kuò)展目標(biāo)的類的功能。
//定義計(jì)算器接口
public interface ICalculator {
public int add(int a, int b);
}
//定義計(jì)算器接口
public class CalculatorImpl implements ICalculator {
@Override
public int add(int a, int b) {
return a + b;
}
}
//裝飾器
public class MyDecorator implements ICalculator {
ICalculator iCalculator = null;
public MyDecorator(ICalculator iCalculator) {
this.iCalculator = iCalculator;
}
@Override
public int add(int a, int b) {
//增加代碼昏名,對(duì)輸入做一些處理
doSthBefore();
int result = iCalculator.add(a, b);
//增加代碼涮雷,對(duì)結(jié)果做一些處理
doSthAfter();
return result;
}
private void doSthBefore() {
}
private void doSthAfter() {
}
}
//調(diào)用代碼
ICalculator iCalculatorImpl = new CalculatorImpl();
ICalculator iCalculator = new MyDecorator(iCalculatorImpl);
iCalculator.add(5, 6);
幾個(gè)需要注意的點(diǎn):
- 裝飾類(MyDecorator)與被裝飾類(CalculatorImpl)要實(shí)現(xiàn)同一個(gè)接口(ICalculator)
- 裝飾類包含有被裝飾類的對(duì)象,因?yàn)橥瑯右克蓪?shí)事轻局。
- doSthBefore()和doSthAfter()的作用同上洪鸭。
區(qū)別在哪里
看到這你可能會(huì)覺得,代理模式和裝飾模式看起來簡(jiǎn)直就像是異父異母的孿生兄弟一樣像仑扑,那干嘛分開來講呢览爵?
上面在談到裝飾模式的時(shí)候,說到了“動(dòng)態(tài)”——加粗的東西通常能給人以不一樣的感官刺激镇饮,很顯然蜓竹,你并沒有體會(huì)過這種感覺——這就是兩者的區(qū)別之一。
為了照顧缺乏想象力的童鞋储藐,我們還是以圖片的形式舉例子
把被裝飾類看做一個(gè)牛奶加工廠俱济,它只負(fù)責(zé)包裝。有一天钙勃,上級(jí)有了新的精神——不是所有的牛奶都叫特輪酥姨蝴,這就要求升級(jí)生產(chǎn)工藝,要對(duì)原材料(散裝奶)進(jìn)行篩選肺缕,符合要求的才會(huì)被包裝,不符合要求的直接廢棄授帕。
圖中兩條紅線就是裝飾者同木,它使加工廠有了篩選的功能,所以是對(duì)原加工廠功能的一種擴(kuò)展跛十。只要篩選標(biāo)準(zhǔn)一致彤路,我們可以把這個(gè)裝飾者加在一個(gè)羊奶加工廠上,一個(gè)可樂加工廠上等等芥映,不需要篩選時(shí)隨時(shí)可以撤銷(引用被裝飾類的對(duì)象即可)洲尊,這就是動(dòng)態(tài)远豺。
擴(kuò)展,是兩種設(shè)計(jì)模式都能實(shí)現(xiàn)的坞嘀。
動(dòng)態(tài)躯护,裝飾模式更側(cè)重一些。
屏蔽丽涩,代理模式更側(cè)重一些(因?yàn)榭蛻舳瞬⒉恢繫yProxy代理的是誰的功能)棺滞。
說白了,兩者的區(qū)別就體現(xiàn)在MyProxy和MyDecorator的構(gòu)造函數(shù)上矢渊。