【结构型】】- 代理模式
时间: 2019-02-20来源:OSCHINA
前景提要
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
代理模式
虚拟代理 :为创建开销大的对象提供代理服务,真正的对象在创建前和创建中时由虚拟代理负责处理(缓冲)
保护代理 :保护目标对象,为其他对象提供一个代理以控制对这个目标对象的访问
动态代理 :运行时动态创建代理类的对象,将方法调用转发到指定类
角色 抽象主题角色:通过接口或抽象类声明真实角色实现的接口,提供给客户端 真实主题角色:实现抽象主题角色,定义真实角色所要实现的业务逻辑,供代理角色调用 代理对象:实现抽象角色,提供真实角色的代理(面向客户端)
抽象主题角色: 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)

数据资讯

数据学院

数据百科

热门排行