一、什么是代理模式(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通俗易懂系列设计模式之代理模式
# 本尊
# 客户端
# 长岛
# 都是
# 送餐
# 这份
# 胶东
# 就在
# 也就
# 也要
# 有很多
# 不需要
# 是指
# 是怎么
# 中有
# 他对
# 这就
# 就没
# 可以看到
# 来看看
相关文章:
如何快速查询网址的建站时间与历史轨迹?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何在Tomcat中配置并部署网站项目?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
开心动漫网站制作软件下载,十分开心动画为何停播?
黑客如何通过漏洞一步步攻陷网站服务器?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
一键网站制作软件,义乌购一件代发流程?
建站之星安装后界面空白如何解决?
定制建站哪家更专业可靠?推荐榜单揭晓
建站之星北京办公室:智能建站系统与小程序生成方案解析
视频网站app制作软件,有什么好的视频聊天网站或者软件?
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何快速查询网站的真实建站时间?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
高端企业智能建站程序:SEO优化与响应式模板定制开发
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
建站之星如何开启自定义404页面避免用户流失?
如何破解联通资金短缺导致的基站建设难题?
如何在阿里云完成域名注册与建站?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在IIS中新建站点并配置端口与IP地址?
小程序网站制作需要准备什么资料,如何制作小程序?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
南宁网站建设制作定制,南宁网站建设可以定制吗?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
招商网站制作流程,网站招商广告语?
如何有效防御Web建站篡改攻击?
实现虚拟支付需哪些建站技术支撑?
如何在腾讯云免费申请建站?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
如何彻底卸载建站之星软件?
建站之星如何实现五合一智能建站与营销推广?
C#怎么创建控制台应用 C# Console App项目创建方法
黑客入侵网站服务器的常见手法有哪些?
建站之星如何配置系统实现高效建站?
,有什么在线背英语单词效率比较高的网站?
如何使用Golang安装API文档生成工具_快速生成接口文档
定制建站价位费用解析与套餐推荐全攻略
免费网站制作appp,免费制作app哪个平台好?
建站上市公司网站建设方案与SEO优化服务定制指南
网站网页制作专业公司,怎样制作自己的网页?
香港服务器租用每月最低只需15元?
代购小票制作网站有哪些,购物小票的简要说明?
,石家庄四十八中学官网?
常州企业建站如何选择最佳模板?
如何解决VPS建站LNMP环境配置常见问题?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
内网网站制作软件,内网的网站如何发布到外网?
*请认真填写需求信息,我们会在24小时内与您取得联系。