標籤:
接上篇:java多線程(一)http://www.cnblogs.com/ChaosJu/p/4528895.html
java實現多線程的方式二,實現Runable介面用到設計模式——靜態代理模式
一.代理模式
代理模式(Proxy Pattern)是對象的結構型模式,代理模式給某一個對象提供了一個代理對象,並由代理對象控制對原對象的引用。
代理模式不會改變原來的介面和行為,只是轉由代理幹某件事,代理可以控制原來的目標,例如:代理商,代理商只會賣東西,但並不會改變行為,不會製造東西。
- 抽象角色:聲明真實對象和代理對象的共同介面;
- 代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的介面以便在任何時刻都能替代真實對象相同的介面以便在任何時刻都能替代真實對象。同時,代理對象可以再執行真實對象操作時,附加其他的操作,相當於對象真實對象進行封裝;
- 真實角色:代理角色代表的真實對象,是我們最終要應用的對象。
二、靜態代理
樓主我要結婚,但是怕麻煩,所以找婚慶公司幫忙布置洞房、搭情境、主持婚禮,大家要清楚真正結婚的是我不是婚慶公司,我們的共同的目的就是結婚順利,
其實就是我結婚找婚慶公司幫忙,婚慶公司幫我完婚,並且加了很多修飾。
角色分析:
真實角色:樓主
代理角色:婚慶公司
抽象角色(共同的介面): 結婚
/** * 靜態代理 設計模式 * 1、真實角色 * 2、代理角色: 持有真實角色的引用 * 3、二者 實現相同的介面 * * @author chaosju * */public class StaticProxy { public static void main(String[] args) { //建立真實角色 Marry you =new LouZhu(); //建立代理角色 +真實角色的引用 Marry company =new WeddingCompany(you); //執行任務 company.marry(); }}//介面interface Marry{ public abstract void marry();}//真實角色class LouZhu implements Marry{ @Override public void marry() { System.out.println("LouZhu and ECS Operations and Maintenance System結婚了...."); } }//代理角色class WeddingCompany implements Marry{ private Marry louzhu; public WeddingCompany() { } public WeddingCompany(Marry louzhu) { this.louzhu = louzhu; } private void before(){ System.out.println("布置洞房...."); } private void after(){ System.out.println("鬧洞房...."); }
@Override public void marry() { before(); louzhu.marry(); after(); } }
執行結果:
缺點:
1)代理類和委託類實現了相同的介面,代理類通過委託類實現了相同的方法。這樣就出現了大量的代碼重複。如果介面增加一個方法,除了所有實作類別需要實現這個方法外,所有代理類也需要實現此方法。增加了代碼維護的複雜度。
2)代理對象只服務於一種類型的對象,如果要服務多類型的對象。勢必要為每一種對象都進行代理,靜態代理在程式規模稍大時就無法勝任了。
舉例說明:代理可以對實作類別進行統一的管理,如在調用具體實作類別之前,需要列印日誌等資訊,這樣我們只需要添加一個代理類,在代理類中添加列印日誌的功能,然後調用實作類別,這樣就避免了修改具體實作類別。滿足我們所說的開閉原則。但是如果想讓每個實作類別都添加列印日誌的功能的話,就需要添加多個代理類,以及代理類中各個方法都需要添加列印日誌功能(如上的代理方法中刪除,修改,以及查詢都需要添加上列印日誌的功能)。
即靜態代理類只能為特定的介面(Service)服務。如想要為多個介面服務則需要建立很多個代理類。則需要引入動態代理。
java多線程(二)——用到的設計模式