接上篇: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 嫦娥結婚了...."); } } //代理角色 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多線程實現Runable接口方式中的應用
-
//實現runnable接口的線程類 public class Programmer implements Runnable { public void run() { for(int i=0;i<1000;i++){ System.out.println("一邊敲helloworld...."); } } } public class ProgrammerApp { public static void main(String[] args) { //1)、創建真實角色 Programmer pro =new Programmer(); //2)、創建代理角色 +真實角色引用 Thread proxy =new Thread(pro); //3)、調用 .start() 啟動線程 proxy.start(); } }
為什么上述的方式實現靜態代理?
- Thread和programer都實現了Runnable接口
- Thread作為代理角色----持有真實角色引用
- Programer是真實角色