文档章节

【结构型】】- 代理模式

ZeroneLove
 ZeroneLove
发布于 02/20 10:10
字数 991
阅读 17
收藏 0

代理模式


虚拟代理:为创建开销大的对象提供代理服务,真正的对象在创建前和创建中时由虚拟代理负责处理(缓冲)

保护代理:保护目标对象,为其他对象提供一个代理以控制对这个目标对象的访问

动态代理:运行时动态创建代理类的对象,将方法调用转发到指定类


角色


  • 抽象主题角色:通过接口或抽象类声明真实角色实现的接口,提供给客户端

  • 真实主题角色:实现抽象主题角色,定义真实角色所要实现的业务逻辑,供代理角色调用

  • 代理对象:实现抽象角色,提供真实角色的代理(面向客户端)


抽象主题角色: AbstractSubject

package com.zhiwei.proxy;

public interface AbstractSubject {
	void operation();
}

真实主题角色:RealSubject

package com.zhiwei.proxy;

public class RealSubject implements AbstractSubject {
    
	private String name = "zhangsan";
	
	public void operation() {
    	System.out.println("被代理目标对象执行方法:operation");
    }
	
    /**
    * 目标对象自有方法
    */
	public void show(){
		System.out.println(name);
	}
}

代理对象:

package com.zhiwei.proxy;

public class ProxyObject implements AbstractSubject {
   
	private AbstractSubject innerRealSubject = null;
	
	public ProxyObject(){
        //默认被代理对象
		innerRealSubject = new RealSubject();
	}
	
	public ProxyObject(AbstractSubject realSubject){
		this.innerRealSubject = realSubject;
	}
	
	/**
	 * 抽象出题角色定义的方法,作为被代理的方法
	 * 调用被代理对象的内部处理,这里可以作为代理对象的方法扩展
	 * 
	 * 保护目标对象:例如提供可以实现类似AOP的功能
	 */
	@Override
	public void operation() {
		  proxyMethod01();
          innerRealSubject.operation();
          proxyMethod01();
	}
	
	/**
	 * 代理对象的功能扩充
	 */
	public void proxyMethod01(){
		System.out.println("代理对象的自定义方法:proxyMethod01");
	}
	
	public void proxyMethod02(){
		System.out.println("代理对象的自定义方法:proxyMethod02");
	}

}

测试代码:

	//代理对象通过实体对象初始化
		RealSubject realSubject = new RealSubject();
		ProxyObject proxyObject = new ProxyObject(realSubject);
		proxyObject.operation();
		
		System.out.println("---------------------------------");
		
		//代理对象通过默认的实体对象代理
		ProxyObject po = new ProxyObject();
		po.operation();

代理模式分析


保护目标对象: 若目标对象涉及到很多属性,且目标对象提供接口给特定对象调用,使用代理对象可通过仅代理目标对象需提供的方法,这样客户端通过代理对象就不能访问目标对象私有接口,从而实现目标对象的保护。

扩展功能:因代理模式是通过代理目标对象来处理实际的业务逻辑,代理对象管理目标对象的调用流程,可通过代理模式在目标方法的执行过程添加某些特定的功能,例如日记监控,Spring AOP。

通俗理解:

例如:摩拜共享单车流程

  • 目标对象:人
  • 代理对象:摩拜APP(摩拜公司),
  • 流程:去骑摩拜单车前,扫码,APP帮助我们处理前期的工作:是否注册为膜拜用户 -> APP个人余额 -> 单车是否故障 -> 是否被别人预约 -> 打开电子锁 -> 骑走单车 -> 单车用完 ->关掉电子锁 -> 摩拜确认是否上锁 -> 扣款,积累信用分等操作。

正向代理服务器:客户端发送请求给目标服务器,目标服务器代理客户端请求,请求真正的目标服务器,并将响应结果返回给客户端(常用的翻墙技术:VPN)

反向代理服务器:客户端发动请求给目标服务器,目标服务器并不会真正处理客户端请求,而是将客户的请求转发给内部的服务器集群处理,然后内部服务器将结果--> 反向代理服务器--> 客户端(典型应用:Nginx)

© 著作权归作者所有

ZeroneLove
粉丝 5
博文 164
码字总数 133695
作品 0
深圳
高级程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.4K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
169
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部