代理模式的定義: 由於某些原因需要提供某個物件一個代理程式以控制對該物件的存取。這時,訪問對像不適合或不能直接引用目標對象,代理對像作為訪問對象和目標對象之間的中介。
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(); } }
這裡可以看出第一次賣酒和第二次賣酒輸出的結果不一樣,因為每一次賣酒都要去乾娘的酒館拿酒。大奔第一次來拿酒的時候通知乾娘,我來擺攤了,後面乾娘已經知道大奔來了所以再拿酒就不需要通知了。
以上是Java設計模式的代理模式怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!