代理設計模式
特點:兩個子類共同實現同一個接口,其中一個子類負責真實業務實現,另一個子類完成輔助真實業務主題的操作
用我們生活中經常碰見的例子來說明,在玩遊戲時會有“代練”幫助玩家上分,在買東西時會有“代購”幫助買家購買相應的東西。這裏的“代練”,“代購”實際上就是抽象的“代理設計模式”,思想來源於生活,因此“代理設計模式”的實現思想和“代購”“代練”一樣,我作爲女生對代購還是比較熟悉的,下面就用”買口紅“這個例子來解釋代理設計模式到底是怎樣實現的。
在”代理設計模式“中需要有三個必要要素:接口,真實主題類和代理類,結合”買口紅“的例子,接口就是”買口紅“,由於會買各種各樣品牌的口紅,因此要用接口實現,真實主題類就是買家自己,代理類就是代購,這三個要素缺一不可。
對應關係爲:
接口-買口紅
真實主題類-自己
代理類-代購
//接口(買口紅)
interface ISubject{
void buyLipstick();
}
//真實主題類
class RealSubject implements ISubject{
@Override
public void buyLipstick() {
System.out.println("買mac口紅");
}
}
//代理類
class ProxySubject implements ISubject{
//代理需要知道真實客戶的存在
private ISubject realSubject;
//代理與真實客戶建立聯繫
//傳接口對象:不同客戶需要不同口紅,只需要繼承接口即可
public ProxySubject(ISubject realSubject){
this.realSubject = realSubject;
}
public void beforeBuy(){
System.out.println("取錢,排隊");
}
public void afterBuy(){
System.out.println("發貨,驗收");
}
@Override
public void buyLipstick() {
//輔助操作
beforeBuy();
//真實操作(付錢由真實顧客完成,代購只是輔助操作)
this.realSubject.buyLipstick();
//輔助操作
afterBuy();
}
}
public class Test {
public static void main(String[] args) {
ISubject iSubject = new ProxySubject(new RealSubject());
iSubject.buyLipstick();
}
}
如上便實現了代理設計模式
在Java中”代理設計模式還是比較常見的,例如在多線程中Thread就使用了代理設計模式
觀察多線程部分中Thread和Runnable源碼可以看出來:
- 詳細內容可以參考:
代理設計模式 :
class Thread implements Runnable {...}//Thread是輔助完成資源調度,線程啓動,真正做的事情在自己實現的MyThread裏面
class MyThread implements Runnable{...}//真實業務