java多線程(二)——用到的設計模式

來源:互聯網
上載者:User

標籤:

接上篇:java多線程(一)http://www.cnblogs.com/ChaosJu/p/4528895.html

java實現多線程的方式二,實現Runable介面用到設計模式——靜態代理模式

一.代理模式
  • 代理模式的定義

  代理模式(Proxy Pattern)是對象的結構型模式,代理模式給某一個對象提供了一個代理對象,並由代理對象控制對原對象的引用。

  代理模式不會改變原來的介面和行為,只是轉由代理幹某件事,代理可以控制原來的目標,例如:代理商,代理商只會賣東西,但並不會改變行為,不會製造東西。

  • 代理模式涉及到的角色
  1. 抽象角色:聲明真實對象和代理對象的共同介面;
  2. 代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的介面以便在任何時刻都能替代真實對象相同的介面以便在任何時刻都能替代真實對象。同時,代理對象可以再執行真實對象操作時,附加其他的操作,相當於對象真實對象進行封裝;
  3. 真實角色:代理角色代表的真實對象,是我們最終要應用的對象。
  • 代理模式的類結構圖
二、靜態代理
  •   代理模式舉例

     樓主我要結婚,但是怕麻煩,所以找婚慶公司幫忙布置洞房、搭情境、主持婚禮,大家要清楚真正結婚的是我不是婚慶公司,我們的共同的目的就是結婚順利,

     其實就是我結婚找婚慶公司幫忙,婚慶公司幫我完婚,並且加了很多修飾。

     角色分析:

     真實角色:樓主

     代理角色:婚慶公司

     抽象角色(共同的介面): 結婚

/** * 靜態代理 設計模式 * 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多線程實現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是真實角色

java多線程(二)——用到的設計模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.