一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java設計模式之代理模式(Porxy)詳解

java設計模式之代理模式(Porxy)詳解

2020-11-17 11:09當代唐寅 Java教程

這篇文章主要為大家詳細介紹了java設計模式之代理模式Porxy的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、什么是代理模式(Porxy)

  概念:代理模式就是為其他對象提供一種代理以控制對這個對象的訪問。

  現實生活中也有很多行為吻合代理模式。比如店外賣,客戶在APP上下單后,店長會接單。這個時候店長可以選擇自己去送這份外賣,也可以委托送餐員代理店長去送這份外賣。當然店長是可以自己送,但店長送了外賣店就沒人看著了,而讓送餐員代理送外賣就不會這樣了。這里很顯然店長是對象本尊(Subject),送餐員是代理對象(Proxy ),代理對象中有店長給的訂單信息,比如送到哪里,幾點之前要送到,這就說明代理對象中需要包含本尊。下面根據實際代碼來說明代理模式和非代理的具體實現。

二、模式對比

1、非代理模式

非代理模式即店長自己送,無須委托送餐員代理送。即直接創建本尊對象并訪問本尊方法,沒有中間的代理對象。

本尊代碼

java" id="highlighter_759803">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ShopKeeper {
 
  //客戶信息
  private Consumer consumer;
  
  public ShopKeeper(Consumer consumer){
    this.consumer = consumer;
  }
  
  //外賣訂單信息
  public void send(){
    System.out.println(consumer.getConName() + "的訂單,店長自己送,送到膠東路520弄,11:30之前送達...");
  }
  
}

客戶代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Consumer {
 
  private String conName;
  
  public Consumer(String conName){
    this.conName = conName;
  }
 
  public String getConName() {
    return conName;
  }
}

客戶端測試代碼

?
1
2
3
4
5
6
7
8
9
public class Show {
 
  public static void main(String[] args) {
    Consumer consumer = new Consumer("Tom");
    ShopKeeper shopKeeper = new ShopKeeper(consumer);
    shopKeeper.send();
  }
  
}

這樣店長和客戶的代碼就耦合在一起,不利于后期維護升級。再者店長和客戶本來就不需要相互包含,他們之間是無狀態的。像很多pub/sub的中間件,比如dubbo,activeMQ等等,他們都是基于消息的發布的訂閱機制,生產者和消費者之間沒有必要有狀態交互,你消費者掛了我生產者還是繼續生產消息,互不影響,其實很多技術都是想通的,這里和代理模式就和類似。下面來看看代理模式是怎么處理的。

2、代理模式

提供了一個共有的送外賣接口

?
1
2
3
4
5
6
7
public interface Send {
 
  void sendName();
  void sendTime();
  void sendAddress();
  
}

店長本尊對象,實現了共有的送外賣接口。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 * 店長對象(本尊)需要實現Send接口
 * @author user
 */
public class ShopKeeper implements Send{
 
  private Consumer consumer;
  
  public ShopKeeper(Consumer consumer){
    this.consumer = consumer;
  }
  
  @Override
  public void sendName() {
    System.out.print(consumer.getConName() + "的訂單,");
  }
  
  @Override
  public void sendTime() {
    System.out.print("12:00之前送達,");
  }
 
  @Override
  public void sendAddress() {
    System.out.print("送到長島路520弄,由代理對象配送...");
  }

新增了代理對象,代理對象需要包含本尊,并且也要實現送外賣(Send)接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * 代理對象也需要實現Send接口
 * @author user
 *
 */
public class ProxySend implements Send{
 
  private ShopKeeper shopKeeper;
  
  public ProxySend(Consumer consumer){
    this.shopKeeper = new ShopKeeper(consumer);
  }
  
  @Override
  public void sendName() {
    shopKeeper.sendName();
  }
 
  @Override
  public void sendTime() {
    shopKeeper.sendTime();
  }
 
  @Override
  public void sendAddress() {
    shopKeeper.sendAddress();
  }
 
}

客戶對象沒有變化

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Consumer{
  
  private String conName;
 
  public String getConName() {
    return conName;
  }
 
  public void setConName(String conName) {
    this.conName = conName;
  }
}

客戶端測試代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Show {
 
  public static void main(String[] args) {
    
    Consumer consumer = new Consumer();
    consumer.setConName("外賣張");
    ProxySend proxy = new ProxySend(consumer);
    proxy.sendName();
    proxy.sendTime();
    proxy.sendAddress();
    
  }
  
}

看輸出

外賣張的訂單,12:00之前送達,送到長島路520弄...

這樣代理對象就幫本尊完成了任務,可以看到客戶端的代碼變化很大,客戶端根本不知道本尊的存在,因為在客戶端代碼中至始至終都沒有看到本尊對象的創建,連實例都沒有,這其實就是代理對象的作用之一,隱藏本尊。

3、代理模式基本結構

Subject類,定義了RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy,這里使用抽象類

?
1
2
3
4
5
public abstract class Subject {
 
  public abstract void request();
  
}

RealSubject類,定義了Proxy所代表的真是實體

?
1
2
3
4
5
6
7
8
public class RealSubject extends Subject {
 
  @Override
  public void request() {
    System.out.println("真實的請求");
  }
 
}

Proxy類,保存了一個引用使得代理對象可以訪問實體對象,并提供一個與Subject的接口相同的接口,這樣代理就可以用來代理實體。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Proxy extends Subject{
 
  RealSubject realSubject;
  
  @Override
  public void request() {
    if (realSubject == null) {
      realSubject = new RealSubject();
    }
    realSubject.request();
  }
 
}

客戶端代碼

?
1
2
3
4
5
6
7
8
public class Show {
 
  public static void main(String[] args) {
    Proxy proxy = new Proxy();
    proxy.request();
  }
  
}

測試結果

真實的請求

4、UML圖

java設計模式之代理模式(Porxy)詳解

三、總結

代理模式一般用在一下幾種場合。1、遠程代理,也就是為了一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在于不同地址空間的事實。2、虛擬代理,是根據需要創建開銷很大的對象。通過它來存放實例化需要很長時間的真實對象。3、安全代理,用來控制真實對象訪問是的權限。4、智能指引,是指當前調用真實的對象時,代理處理另外一些事情。所以代理模式還算比較常用的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/mxlandxt/p/6892914.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91制片厂制作果冻传媒123 | 2012年中文字幕在线看 | 北岛玲亚洲一区在线观看 | 日本高清在线精品一区二区三区 | 欧美特黄三级在线观看 | 欧美亚洲国产另类 | 无码AV熟妇素人内射V在线 | 九九免费高清在线观看视频 | 污樱桃视频 | 三级伦理在线播放 | 禁止的爱善良的未删减版hd | 精品一区二区三区 不卡高清 | 四虎免费影院ww4164h | 色狠狠成人综合网 | 国产精品成人麻豆专区 | 欧美╳bbbb | 亚洲第一区在线观看 | 毛片网站免费观看 | 午夜a一级毛片 | 草草视频免费在线观看 | 放荡的女老板bd中文字幕 | 91九色porny国产美女一区 | 亚洲欧洲日产国码 最新 | 范冰冰好紧好滑好湿 | 色老板免费 | 国产精品亚洲片在线不卡 | 白丝憋尿| 欧美草比视频 | 爽好舒服快想要免费看 | 香蕉草莓视频 | 青青国产成人久久激情91麻豆 | 精品香蕉99久久久久网站 | 国产一区二区三区久久小说 | 色老板成人永久免费视频 | 亚洲va天堂va国产va久久 | 国产在线观看福利片 | 91久久精品青青草原伊人 | 亚洲成在人线久久综合 | 亚洲欧美精品一区二区 | 美女私人影院 | 国产大片线上免费观看 |