欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java設(shè)計(jì)模式之代理模式(Porxy)詳解

 更新時(shí)間:2017年06月15日 08:33:51   作者:當(dāng)代唐寅  
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之代理模式Porxy的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

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

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

二、模式對(duì)比

1、非代理模式

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

本尊代碼

public class ShopKeeper {

  //客戶信息
  private Consumer consumer;
  
  public ShopKeeper(Consumer consumer){
    this.consumer = consumer;
  }
  
  //外賣訂單信息
  public void send(){
    System.out.println(consumer.getConName() + "的訂單,店長(zhǎng)自己送,送到膠東路520弄,11:30之前送達(dá)...");
  }
  
}

客戶代碼

public class Consumer {

  private String conName;
  
  public Consumer(String conName){
    this.conName = conName;
  }

  public String getConName() {
    return conName;
  }
}

客戶端測(cè)試代碼

public class Show {

  public static void main(String[] args) {
    Consumer consumer = new Consumer("Tom");
    ShopKeeper shopKeeper = new ShopKeeper(consumer);
    shopKeeper.send();
  }
  
}

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

2、代理模式

提供了一個(gè)共有的送外賣接口

public interface Send {

  void sendName();
  void sendTime();
  void sendAddress();
  
}

店長(zhǎng)本尊對(duì)象,實(shí)現(xiàn)了共有的送外賣接口。

/**
 * 店長(zhǎng)對(duì)象(本尊)需要實(shí)現(xiàn)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之前送達(dá),");
  }

  @Override
  public void sendAddress() {
    System.out.print("送到長(zhǎng)島路520弄,由代理對(duì)象配送...");
  }

新增了代理對(duì)象,代理對(duì)象需要包含本尊,并且也要實(shí)現(xiàn)送外賣(Send)接口

/**
 * 代理對(duì)象也需要實(shí)現(xiàn)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();
  }

}

客戶對(duì)象沒有變化

public class Consumer{
  
  private String conName;

  public String getConName() {
    return conName;
  }

  public void setConName(String conName) {
    this.conName = conName;
  }
}

客戶端測(cè)試代碼

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之前送達(dá),送到長(zhǎng)島路520弄...

這樣代理對(duì)象就幫本尊完成了任務(wù),可以看到客戶端的代碼變化很大,客戶端根本不知道本尊的存在,因?yàn)樵诳蛻舳舜a中至始至終都沒有看到本尊對(duì)象的創(chuàng)建,連實(shí)例都沒有,這其實(shí)就是代理對(duì)象的作用之一,隱藏本尊。

3、代理模式基本結(jié)構(gòu)

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

public abstract class Subject {

  public abstract void request(); 
  
}

RealSubject類,定義了Proxy所代表的真是實(shí)體

public class RealSubject extends Subject {

  @Override
  public void request() {
    System.out.println("真實(shí)的請(qǐng)求");
  }

}

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

public class Proxy extends Subject{

  RealSubject realSubject;
  
  @Override
  public void request() {
    if (realSubject == null) {
      realSubject = new RealSubject();
    }
    realSubject.request();
  }

}

客戶端代碼

public class Show {

  public static void main(String[] args) {
    Proxy proxy = new Proxy();
    proxy.request();
  }
  
}

測(cè)試結(jié)果

真實(shí)的請(qǐng)求

4、UML圖


三、總結(jié)

代理模式一般用在一下幾種場(chǎng)合。1、遠(yuǎn)程代理,也就是為了一個(gè)對(duì)象在不同的地址空間提供局部代表。這樣可以隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)。2、虛擬代理,是根據(jù)需要?jiǎng)?chuàng)建開銷很大的對(duì)象。通過它來存放實(shí)例化需要很長(zhǎng)時(shí)間的真實(shí)對(duì)象。3、安全代理,用來控制真實(shí)對(duì)象訪問是的權(quán)限。4、智能指引,是指當(dāng)前調(diào)用真實(shí)的對(duì)象時(shí),代理處理另外一些事情。所以代理模式還算比較常用的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Java生成JWT令牌的示例代碼

    使用Java生成JWT令牌的示例代碼

    json-web-token簡(jiǎn)稱java web令牌,也稱作JWT,是一種可以實(shí)現(xiàn)跨域身份驗(yàn)證身份的方案,jwt不加密傳輸數(shù)據(jù),但能夠通過數(shù)據(jù)前面驗(yàn)證數(shù)據(jù)的未被篡改,本文給大家介紹了如何使用Java生成JWT令牌,需要的朋友可以參考下
    2024-04-04
  • maven依賴的version聲明控制方式

    maven依賴的version聲明控制方式

    這篇文章主要介紹了maven依賴的version聲明控制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之健身俱樂部管理系統(tǒng)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之健身俱樂部管理系統(tǒng)的實(shí)現(xiàn)

    這是一個(gè)使用了java+SSM+Mysql+Jsp開發(fā)的健身俱樂部管理系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有俱樂部管理該有的所有功能,感興趣的朋友快來看看吧
    2022-02-02
  • SpringBoot3整合pageHelper實(shí)現(xiàn)分頁功能

    SpringBoot3整合pageHelper實(shí)現(xiàn)分頁功能

    PageHelper是一個(gè)開源的Java分頁插件,它提供了方便的分頁查詢功能,適用于大多數(shù)基于Java的持久層框架(如MyBatis、Hibernate等),本文給大家介紹了springboot3整合pageHelper實(shí)現(xiàn)分頁功能的方法,需要的朋友可以參考下
    2024-08-08
  • 純Java代碼實(shí)現(xiàn)流星劃過天空

    純Java代碼實(shí)現(xiàn)流星劃過天空

    本文給大家介紹純java代碼實(shí)現(xiàn)流星劃過天空,包括流星個(gè)數(shù),流星飛行的速度,色階,流星大小相關(guān)變量設(shè)置。對(duì)java流星劃過天空特效代碼感興趣的朋友可以參考下本文
    2015-10-10
  • 利用POI讀取word、Excel文件的最佳實(shí)踐教程

    利用POI讀取word、Excel文件的最佳實(shí)踐教程

    Apache POI 是用Java編寫的免費(fèi)開源的跨平臺(tái)的 Java API,Apache POI提供API給Java程式對(duì)Microsoft Office格式檔案讀和寫的功能。 下面這篇文章主要給大家介紹了關(guān)于利用POI讀取word、Excel文件的最佳實(shí)踐的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • spring boot優(yōu)雅集成redisson詳解

    spring boot優(yōu)雅集成redisson詳解

    這篇文章主要為大家介紹了spring boot優(yōu)雅集成redisson詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 微信小程序獲取手機(jī)號(hào)的完整實(shí)例(Java后臺(tái)實(shí)現(xiàn))

    微信小程序獲取手機(jī)號(hào)的完整實(shí)例(Java后臺(tái)實(shí)現(xiàn))

    我們?cè)谧鲂〕绦蜷_發(fā)的過程中,經(jīng)常會(huì)涉及到用戶身份的問題,最普遍的就是我們要獲取用戶的手機(jī)號(hào)碼,下面這篇文章主要給大家介紹了關(guān)于微信小程序獲取手機(jī)號(hào)的完整實(shí)例,后臺(tái)由Java實(shí)現(xiàn),需要的朋友可以參考下
    2022-06-06
  • MyBatis-Plus 快速入門案例(小白教程)

    MyBatis-Plus 快速入門案例(小白教程)

    這篇文章主要介紹了MyBatis-Plus 快速入門案例(小白教程),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Netty中的心跳檢測(cè)機(jī)制詳解

    Netty中的心跳檢測(cè)機(jī)制詳解

    這篇文章主要介紹了Netty中的心跳檢測(cè)機(jī)制詳解,Netty 是 基于 TCP 協(xié)議開發(fā)的,在四層協(xié)議 TCP 協(xié)議的實(shí)現(xiàn)中也提供了 keepalive 報(bào)文用來探測(cè)對(duì)端是否可用,TCP 層將在定時(shí)時(shí)間到后發(fā)送相應(yīng)的 KeepAlive 探針以確定連接可用性,需要的朋友可以參考下
    2023-12-12

最新評(píng)論