首頁 > 軟體

Java設計模式以虹貓藍兔的故事講解代理模式

2022-04-22 10:00:51

模式: 代理模式

案例: 大奔代乾孃賣酒

什麼是代理模式

代理模式的定義: 由於某些原因需要給某物件提供一個代理以控制對該物件的存取。這時,存取物件不適合或者不能直接參照目標物件,代理物件作為存取物件和目標物件之間的中介。

優點

1、代理模式在使用者端與目標物件之間起到一箇中介作用和保護目標物件的作用;

2、代理物件可以擴充套件目標物件的功能;

3、代理模式能將使用者端與目標物件分離,在一定程度上降低了系統的耦合度,增加了程式的可延伸性

缺點

1、代理模式會造成系統設計中類的數量增加

2、在使用者端和目標物件之間增加一個代理物件,會造成請求處理速度變慢;

3、增加了系統的複雜度;

知識點

代理模式的結構比較簡單,主要是通過定義一個繼承抽象主題的代理來包含真實主題,從而實現對真實主題的存取,下面來分析其基本結構和實現方法。

代理模式實現

案例: 大奔代乾孃賣酒

抽象主題(Subject)類:賣酒

真實主題(Real Subject)類:乾孃的酒館

代理(Proxy)類:大奔的酒攤

大奔來乾孃的酒館前面擺了個攤代理賣酒的生意。

賣酒

一個賣酒介面,宣告了一個賣酒的抽象方法

public interface Jiu {
    void show();
}

乾孃的酒館

乾孃的酒館類實現了賣酒的介面,並且實現了show()賣酒方法,宣告了一個酒的名字,和一個aa()方法提示大奔來擺攤了

public class GanNiang implements Jiu {
    private String name;
    GanNiang() {
    }
    GanNiang(String name) {
        this.name = name;
        aa();
    }
    @Override
    public void show() {
        System.out.printf("賣出一罈%s", name);
    }
    public void aa() {
        System.out.println("大奔來擺攤了");
    }
}

大奔的酒攤

大奔的酒攤類實現了賣酒介面,宣告了酒的名字和乾孃酒館的屬性,並且實現了賣酒方法。

public class DaBen implements Jiu {
    private String name;
    private GanNiang ganNiang;
    DaBen() {
    }
    DaBen(String name) {
        this.name = name;
    }
    @Override
    public void show() {
        if (ganNiang == null) {
            ganNiang = new GanNiang(name);
        }
        ganNiang.show();
    }
}

測試

new一個大奔的酒攤,呼叫兩次show()方法,就相當於賣了兩次酒。

public class Demo {
    public static void main(String[] args) {
        DaBen daBen = new DaBen("女兒紅");
        daBen.show();
        System.out.println();
        System.out.println();
        daBen.show();
    }
}

這裡可以看出第一次賣酒和第二次賣酒輸出的結果不一樣,因為每一次賣酒都要去幹孃的酒館拿酒。大奔第一次來拿酒的時候通知乾孃,我來擺攤了,後面乾孃已經知道大奔來了所以再拿酒就不需要通知了。

總結

代理模式就是找一個代理代替自己去執行,這樣只需要避免了重複new物件的浪費,並且可以找多個代理代替自己。

如:

1、Windows 裡面的快捷方式。

2、豬八戒去找高翠蘭結果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來,高翠蘭本人和孫悟空都實現了這個介面,豬八戒存取高翠蘭的時候看不出來這個是孫悟空,所以說孫悟空是高翠蘭代理類。

3、買火車票不一定在火車站買,也可以去代售點。

4、一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現金,並提供對簽發人賬號上資金的控制。

到此這篇關於Java設計模式以虹貓藍兔的故事講解代理模式的文章就介紹到這了,更多相關Java代理模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com