回覆列表
  • 1 # 匠工加工

    java靜態代理模式,舉例給你,看下如何理解:

    public class Ts {

    public static void main(String[] args) throws Exception {

    // 透過中介公司生產一批衣服

    ClothingProduct cp = new ProxCompany( new LiNingCompany());

    cp.productClothing();

    }

    }

    /**

    * 定義生產一批衣服功能的介面

    *

    */

    interface ClothingProduct {

    void productClothing(); // 有生產一批衣服的功能

    }

    /**

    *

    * 代理類:中介公司

    *

    */

    class ProxCompany implements ClothingProduct {

    private ClothingProduct cp ; // 中介公司不會生產衣服,需要找一家真正能生產衣服的公司

    ProxCompany(ClothingProduct cp) {

    super ();

    this . cp = cp;

    }

    @Override

    public void productClothing() {

    System. out .println( "收取1塊錢的中介費" );

    cp .productClothing();

    }

    }

    /**

    *

    * 李寧公司是生產服裝的目標類

    *

    */

    class LiNingCompany implements ClothingProduct {

    @Override

    public void productClothing() {

    System. out .println( "生產一批衣服。。。。" );

    }

    }

    上面程式的做法,使用的模式是靜態代理模式

    靜態代理模式在現實程式設計中的弊端:

    它的特徵是代理類和目標物件的類都是在編譯期間確定下來的,不利於程式上的擴充套件,上面示例中,如果客戶還想找一個“生產一批鞋子”的工廠,那麼還需要新增加一個代理類和一個目標類。如果客戶還需要很多其他的服務,就必須一一的新增代理類和目標類。那就需要寫很多的代理類和目標類

    代理模式到底做了什麼?

    我眼中的代理模式只有兩個關注點:協議和代理者

    協議定義了一組方法,由某一個類負責實現。

    代理者作為某個類的一個屬性,通常是另一個類的例項物件,可以負責完成原來這個類不方便或者無法完成的任務。

    首先談一談代理者,在腦中重新回想一下代理模式的實現過程。在頁面B中定義一個代理物件的時候,好像和定義一個普通的property非常類似(除了 weak和id《delegate》>)。這也正是我對代理的概括:代理本來就是一個屬性而已,並沒有非常神秘。

    當然,代理者並不只是一個類普通的屬性,否則我只需要重寫一下B的初始化方法即可達到同樣的效果:

    self.BVC = [[BViewController alloc]initWithDelegate:self];

    然後在BViewController.m中定義一個AViewController *AVC並在初始化方法中賦值即可。

    注意到代理者在定義的時候,格式往往是這樣的:

    id <SomeDelegate> delegate;

    所以我對代理的優勢的理解是:

    代理的核心優勢在於解耦

    與直接宣告一個屬於某個固定的類的代理者相比,宣告為id的代理者具備兩個明星的優勢。

    允許多個不同的類成為本類的代理。試想一下在本文例子中,如果頁面B可以跳轉回N個頁面,如果還是透過宣告一個普通物件的方式,那怎麼辦?

    允許代理者的類還不固定。試想一下,UITableView也有delegate,它根本不知道那個類會成為它的代理者。

    再看一看協議。協議更加簡單了。協議只是定義了一組方法。在代理模式中,完全可以不用在頁面B中定義一個協議,然後A再去遵循這個協議。直接呼叫A的方法即可。

    個人認為協議的優點在於以下幾點:

    可以利用Xcode的檢查機制。對於定義為@required的方法,如果實現了協議而沒有實現這個方法,編譯器將會有警告。這樣可以防止因為疏忽,忘記實現某個程式碼的情況,而由於OC的執行時特性,這樣的錯誤往往在執行階段才會導致程式崩潰。

    有利於程式碼的封裝。如果一個類,實現了某個協議,那麼這個協議中的方法不必在.h中被宣告,就可以被定義協議的類呼叫。這樣可以減少一個類暴露給外部的方法。

    有利於程式的結構化與層次化。一個協議往往是解決問題的某個方法,對於一個其他的不過卻類似的問題,我們只用再次實現協議即可,避免了自己再次構思一組方法。協議的繼承機制使得這一有點更加強大。

    說了怎麼多,總結起來只有一句:代理模式並不神秘,只是一個經過了最佳化的小技巧(讓某個類持有另一個類的指標)。代理和協議也只是讓程式耦合度更低,結構感更強而已。

  • 中秋節和大豐收的關聯?
  • 古文《狼》劃分朗讀節奏?