全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java设计模式之代理模式(Porxy)详解

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

  概念:代理模式就是为其他对象提供一种代理以控制对这个对象的访问。

  现实生活中也有很多行为吻合代理模式。比如店外卖,客户在APP上下单后,店长会接单。这个时候店长可以选择自己去送这份外卖,也可以委托送餐员代理店长去送这份外卖。当然店长是可以自己送,但店长送了外卖店就没人看着了,而让送餐员代理送外卖就不会这样了。这里很显然店长是对象本尊(Subject),送餐员是代理对象(Proxy ),代理对象中有店长给的订单信息,比如送到哪里,几点之前要送到,这就说明代理对象中需要包含本尊。下面根据实际代码来说明代理模式和非代理的具体实现。

二、模式对比

1、非代理模式

非代理模式即店长自己送,无须委托送餐员代理送。即直接创建本尊对象并访问本尊方法,没有中间的代理对象。

本尊代码

public class ShopKeeper {

  //客户信息
  private Consumer consumer;
  
  public ShopKeeper(Consumer consumer){
    this.consumer = consumer;
  }
  
  //外卖订单信息
  public void send(){
    System.out.println(consumer.getConName() + "的订单,店长自己送,送到胶东路520弄,11:30之前送达...");
  }
  
}

客户代码

public class Consumer {

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

  public String getConName() {
    return conName;
  }
}

客户端测试代码

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、代理模式

提供了一个共有的送外卖接口

public interface Send {

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

店长本尊对象,实现了共有的送外卖接口。

/**
 * 店长对象(本尊)需要实现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)接口

/**
 * 代理对象也需要实现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();
  }

}

客户对象没有变化

public class Consumer{
  
  private String conName;

  public String getConName() {
    return conName;
  }

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

客户端测试代码

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,这里使用抽象类

public abstract class Subject {

  public abstract void request(); 
  
}

RealSubject类,定义了Proxy所代表的真是实体

public class RealSubject extends Subject {

  @Override
  public void request() {
    System.out.println("真实的请求");
  }

}

Proxy类,保存了一个引用使得代理对象可以访问实体对象,并提供一个与Subject的接口相同的接口,这样代理就可以用来代理实体。

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();
  }
  
}

测试结果

真实的请求

4、UML图


三、总结

代理模式一般用在一下几种场合。1、远程代理,也就是为了一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。2、虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。3、安全代理,用来控制真实对象访问是的权限。4、智能指引,是指当前调用真实的对象时,代理处理另外一些事情。所以代理模式还算比较常用的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # 设计模式  # 代理模式  # Porxy  # 详解JAVA设计模式之代理模式  # Java设计模式之动态代理模式实例分析  # Java设计模式之静态代理模式实例分析  # 23种设计模式(7) java代理模式  # java设计模式笔记之代理模式  # java设计模式学习之代理模式  # java设计模式-代理模式(实例讲解)  # Java设计模式之代理模式与装饰模式实例详解  # Java设计模式之代理模式_动力节点Java学院整理  # java设计模式—静态代理模式(聚合与继承方式对比)  # 详解设计模式中的proxy代理模式及在Java程序中的实现  # Java使用设计模式中的代理模式构建项目的实例展示  # 实例讲解Java设计模式编程中如何运用代理模式  # Java设计模式之代理模式(Proxy模式)介绍  # Java通俗易懂系列设计模式之代理模式  # 本尊  # 客户端  # 长岛  # 都是  # 送餐  # 这份  # 胶东  # 就在  # 也就  # 也要  # 有很多  # 不需要  # 是指  # 是怎么  # 中有  # 他对  # 这就  # 就没  # 可以看到  # 来看看 


相关文章: 建站之星安装提示数据库无法连接如何解决?  高端建站三要素:定制模板、企业官网与响应式设计优化  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  网站制作网站,深圳做网站哪家比较好?  建站之星安装后如何配置SEO及设计样式?  ,巨量百应是干嘛的?  如何高效生成建站之星成品网站源码?  怎么将XML数据可视化 D3.js加载XML  如何通过cPanel快速搭建网站?  如何打造高效商业网站?建站目的决定转化率  建站之星云端配置指南:模板选择与SEO优化一键生成  活动邀请函制作网站有哪些,活动邀请函文案?  如何快速搭建高效服务器建站系统?  视频网站制作教程,怎么样制作优酷网的小视频?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  金*站制作公司有哪些,金华教育集团官网?  定制建站流程步骤详解:一站式方案设计与开发指南  建站主机功能解析:服务器选择与快速搭建指南  如何做静态网页,sublimetext3.0制作静态网页?  建站主机CVM配置优化、SEO策略与性能提升指南  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  广平建站公司哪家专业可靠?如何选择?  北京网站制作公司哪家好一点,北京租房网站有哪些?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  专业公司网站制作公司,用什么语言做企业网站比较好?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何高效利用200m空间完成建站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何破解联通资金短缺导致的基站建设难题?  长沙做网站要多少钱,长沙国安网络怎么样?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何用腾讯建站主机快速创建免费网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何访问已购建站主机并解决登录问题?  建站主机类型有哪些?如何正确选型  已有域名和空间如何搭建网站?  小型网站建站如何选择虚拟主机?  如何在Windows虚拟主机上快速搭建网站?  如何快速生成凡客建站的专业级图册?  油猴 教程,油猴搜脚本为什么会网页无法显示?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  无锡营销型网站制作公司,无锡网选车牌流程?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  建站之星如何取消后台验证码生成?  如何在万网自助建站平台快速创建网站?  模具网站制作流程,如何找模具客户?  如何用花生壳三步快速搭建专属网站?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。