Proxy 模式
代理模式详解

代理模式详解代理模式为对象提供⼀个代理以控制对这个对象的访问。
所谓代理,是指与代理元(即:被代理的对象)具有相同接⼝的类,客户端必须通过代理与代理元进⾏交互。
我们可以将代理理解成另⼀个对象的代表。
代理(proxy)模式本质上就是通过⼀个代理对象访问⽬标对象,⽽不直接访问⽬标对象;代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进⾏⼀些功能的附加与增强。
这么做的好处是,可以让⽬标对象只关注业务逻辑,⽽⾮业务逻辑(⽐如⽇志输出等)可以在代理对象中实现,实现业务分离。
代理模式要点:代理模式包含三个要素:1)接⼝/Interface; 2)代理元/Target:即被代理的对象; 3)代理类/Proxy:代理元的代表,对外提供访问;代理元与代理类都是接⼝的实现类;客户端只能访问代理类,⽆法直接访问代理元;代理分为静态代理和动态代理。
静态代理静态代理就是在编译时⽣成代理类。
即:通过编码⼿动创建代理类,并在代理类中调⽤代理元。
编码实现1.接⼝package effectiveJava.proxy;public interface HelloService {void sayHello();}2,代理元package effectiveJava.proxy;public class HelloServiceImpl implements HelloService{@Overridepublic void sayHello() {System.out.println("Hello Proxy.");}}3,代理类package effectiveJava.proxy.staticProxy;import effectiveJava.proxy.HelloService;public class LogProxy implements HelloService {private HelloService service;public LogProxy(HelloService service) {this.service = service;}@Overridepublic void sayHello() {System.out.println("Static Proxy : Before Hello....");service.sayHello();System.out.println("Static Proxy : After Hello....");}}4,测试类package effectiveJava.proxy.staticProxy;import effectiveJava.proxy.HelloServiceImpl;public class LogProxyDemo {public static void main(String[] args) {LogProxy logProxy = new LogProxy(new HelloServiceImpl());logProxy.sayHello();}}5,测试结果Static Proxy : Before Hello....Hello Proxy.Static Proxy : After Hello....动态代理动态代理地实现有两种⽅式:1)基于JDK的动态代理;2)基于CGLIB的动态代理;1)基于JDK的动态代理APIpublic class Proxy implements java.io.Serializable {/** * 创建代理实例* @param loader 代理元的类加载器* @param interfaces 代理元的接⼝* h ⼀个 InvocationHandler 对象*/ public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h); }/** * * 每个代理的实例都有⼀个与之关联的 InvocationHandler 实现类, * 如果代理的⽅法被调⽤,那么代理便会通知和转发给内部的 InvocationHandler 实现类,由它决定处理。
Objective-C设计模式-代理模式(Proxy)

Objective-C设计模式-代理模式(Proxy)代理模式定义 代理模式(Proxy),为其他对象提供⼀种代理,以控制对这个对象的访问。
属于结构型模式,它为⼀个对象提供替代者或占位者,客户端通过代理对象访问⽬标对象,代理对象在客户端和⽬标对象之间起到中介的作⽤。
有以下⼏种代理:1. 远程代理(Remote proxy),为⼀个不同地址空间或⽹络上的对象提供本地代表。
好处是代理对象将⽹络的细节封装起来,客户端不必关⼼⽹络的存在。
2. 虚拟代理(Virtual proxy),根据需要创建重型或开销很⼤的对象。
如果需要创建⼀个资料消耗较⼤的对象,先创建⼀个开销较⼩的对象来占位表⽰,等真正需要时才创建实体对象。
这⾥起到了延迟对象实例化,来减缓对系统资源的消耗的作⽤。
3. 保护代理(protection proxy),通过不同的访问权限控制对原始对象的访问。
4. 智能引⽤代理(Smart reference proxy),当⼀个对象被引⽤时,提供⼀些额外的操作,⽐如将对此对象调⽤的次数记录下来等。
代理模式结构图:代理模式中的⾓⾊都实现的类似相同的接⼝,客户端向Proxy发送request消息时,Proxy持有RealSubject的引⽤,会将消息通过request接⼝转发给RealSubject对象,RealSubject会执⾏实际的操作间接满⾜了客户端的请求。
虚拟代理实现图⽚延时加载 在ios中应⽤开发中,经常需要显⽰⼤量的图像,如定义⼀个允许⽤户浏览相册的需求,视图以列表的形式呈现。
如果将相册中的图⽚全部加载⼜不可⾏,移动设备上的内存很有限,必然会影响性能。
⽽且在图像渲染到屏幕上之前,系统需要进⾏从磁盘上加载图⽚、解压缩等⼀些耗时操作,这些可能会影响视图显⽰的即时性。
通过虚拟代理实现图⽚延时加载可以很好的解决这些问题,实现的⽅式如下图所⽰。
图中ImageLoadProtocol协议表⽰代理模式中的抽象类,并定义了loadImage接⼝,ImageLoader表⽰⽬标对象,⽽ImageViewController既充当代理对象,它也是代理模式中的客户端⾓⾊,本来客户端⾓⾊应该是继承UITableView的⼦类来表⽰,但是这⾥视图不是通过继承,⽽是使⽤ios中的delegate委托模式把处理数据、加载图⽚等这些本属于UITableView的⼯作给它的委托对象ImageViewController来完成,这样ImageViewController也就相当于充当了客户端⾓⾊。
设计模式——结构型模式(包含7种)

设计模式——结构型模式(包含7种)结构型设计模式是从程序的结构上解决模块之间的耦合问题。
包括以下七种模式:1.Adapte适配器模式:Adapter模式通过类的继承或者对象的组合侧重于转换已有的接⼝,类适配器采⽤“多继承”的实现⽅式,带来了不良的⾼耦合,所以⼀般不推荐使⽤。
对象适配器采⽤“对象组合”的⽅式,更符合松耦合精神。
例如:笔记本电源适配器,可以将220v转化为适合笔记本使⽤的电压。
2.Bridge桥接模式:将抽象部分与实现部分分离,使它们都可以独⽴的变化。
减少因变化带来的代码的修改量。
例如:经典例⼦,电灯开关,开关的⽬的是将设备打开或关闭,产⽣的效果不同。
posite组合模式:将对象组合成树形结构以表⽰“部分-整体”的层次结构。
Composite模式使得客户对单个对象和组合对象的使⽤具有⼀致性。
从⽽解决了解决客户程序与复杂对象容器的解耦,即:通过继承统⼀的接⼝,我们可以将容器对象及其⼦对象看成同⼀类对象使⽤,以减少对象使⽤中的复杂度。
例如:让⽤户⼀致地使⽤单个对象和组合对象,1+2和(1+1)+(2*3)都是合法的表达式。
单个与整体都可以进⾏加法运算符的操作。
4.Decorator装饰模式:动态地给⼀个对象添加⼀些额外的职责。
就增加功能来说,Decorator模式相⽐⽣成⼦类更为灵活。
[GOF 《设计模式》]Decorator模式采⽤对象组合⽽⾮继承的⼿法,实现了在运⾏时动态的扩展对象功能的能⼒,⽽且可以根据需要扩展多个功能,避免了单独使⽤继承带来的“灵活性差”和“多⼦类衍⽣问题”。
同时它很好地符合⾯向对象设计原则中“优先使⽤对象组合⽽⾮继承”和“开放-封闭”原则。
例如:⼀幅画,可以直接挂到墙上,也可以加上框架和镶上玻璃后,再挂到墙上。
5.Facade外观模式:为⼦系统中的⼀组接⼝提供⼀个⼀致的界⾯,简化接⼝。
例如:我们拨打10086,可以办理,彩铃,⼿机报,全时通等业务(⼦对象),⽽10086则是为⼦对象所使⽤的⼀致界⾯。
一文彻底搞懂代理模式(Proxy)

⼀⽂彻底搞懂代理模式(Proxy)⽂章已收录我的仓库:代理模式引⾔代理模式是⾮常常见的模式,在⽣活中的例⼦也⾮常多,例如你不好意思向你关系不太好朋友帮个忙,这时需要找⼀个和它关系好的应⼀个朋友帮忙转达,这个中间朋友就是代理对象。
例如购买⽕车票不⼀定要去⽕车站买,可以通过12306⽹站或者去⽕车票代售点买。
⼜如找⼥朋友、找保姆、找⼯作等都可以通过找中介完成。
代理模式的定义与特点代理模式的定义:由于某些原因需要给某对象提供⼀个代理以控制对该对象的访问。
这时,访问对象不适合或者不能直接引⽤⽬标对象,代理对象作为访问对象和⽬标对象之间的中介。
考虑⽣活中⼀个常见的例⼦,客户想买房,房东有很多房,提供卖房服务,但房东不会带客户看房,于是客户通过中介买房。
你可能⽆法理解这⾥中介是代替客户买房还是代替房东卖房,其实这是很好理解的。
我们程序编写代码是为客户服务的,中介是代替⼀名服务商处理业务,这种服务可能被定义为卖房,也可能被定义为帮助客户买房,但中介唯独不可能去实现买房的功能,在代码中,我们定义的是服务于客户的业务接⼝,⽽不是客户的需求接⼝,如果让客户和中介都去实现买房接⼝,那么这⾥的买房就是⼀种业务,服务于卖房的客户,这样房东就是客户端,买房的⼀⽅就是服务端。
但在⽣活中,买房的⼀⽅往往是客户端,卖房的才是服务端,因此这⾥中介和房东都要实现卖房的接⼝⽅法,换句话说,中介是代替房东卖房⽽不是代替客户买房。
客户将中介抽象看成房东,直接从中介⼿中买房(中介==房东,提供卖房服务)。
这⾥中介就是代理对象,客户是访问对象,房东是⽬标对象,实际由代理完全操控与⽬标对象的访问,访问对象客户仅与代理对象交流。
,代理模式的结构代理模式的结构⽐较简单,主要是通过定义⼀个继承抽象主题的代理来包含真实主题,从⽽实现对真实主题的访问,下⾯来分析其基本结构。
代理模式的主要⾓⾊如下。
1. 抽象主题(Subject)类(业务接⼝类):通过接⼝或抽象类声明真实主题和代理对象实现的业务⽅法,服务端需要实现该⽅法。
代理模式和适配器模式的对比

代理模式和适配器模式的对比介绍软件开发一直是一个变化规律极为频繁的行业,随着时间的推移,软件设计模式被广泛应用于软件开发。
设计模式是一种特殊的代码重构技巧,它们被设计用于解决一些在软件开发中经常遇到的问题。
其中代理模式和适配器模式是两种常见的设计模式。
本文将对它们进行对比探讨,旨在深入了解它们之间的异同点。
代理模式代理模式(Proxy Pattern)是软件开发中的一种设计模式,它的目的是通过使用一个代理对象来控制对设计对象的访问。
代理是对象的一个抽象,可以在原对象之前进行前置处理,在原对象之后进行后置处理,并且不影响原对象的逻辑实现。
例如,假设我们需要访问一个网络资源,而这个资源的访问需要耗费大量的时间和数据带宽。
在这种情况下,我们可以使用代理模式,将代理对象作为访问网络资源的入口,代理对象会负责从网络中加载必要的资源。
此外,代理模式还可以用于实现权限和安全控制。
适配器模式适配器模式(Adapter Pattern)是软件开发中的一种设计模式,它的目的是在不改变现有代码的基础上,将不兼容的对象包装到一个可用对象中。
适配器模式主要用于解决两个接口不兼容的问题,可以将不同的接口封装到一个通用的接口中,从而可以实现彼此之间的协作。
例如,在一个应用中,我们可能需要将一些数据从一个数据源中提取出来,并将其转换为另一种格式,以便在另一个应用中使用。
在这种情况下,我们可以使用适配器模式来实现数据的转换和传输。
对比代理模式和适配器模式都是常见的设计模式,它们在实际的软件开发中有不同的应用场景。
首先,代理模式和适配器模式的目的和实现方式不同。
代理模式的目的是在原有的基础上添加额外的控制和安全性,而适配器模式的目的是实现两个不兼容的接口之间的协作。
代理模式通过在原对象之前和之后进行前置和后置处理来实现额外控制的目的。
其次,代理模式和适配器模式的实现方式不同。
适配器模式通过将不兼容的对象包装在一个可用的对象中来实现数据转换和传输的目的。
代理模式

所谓模式
所谓模式,简而言之是,人们在自己的环境中 不断发现问题忽然寻找问题的解决方案的时候, 发现有一些问题及其解决方案不断变换面孔重复 出现,但是这些不同的面孔后面有着共同的本质, 这些共同的本质就是模式。
代理的例子
Window系统提供的快捷方(Shortcut), 可以以使任何对象同时出现在多个地方而 不必修改源对象,对快捷方式的调用与原 对象的调用一样,如果原对象被删除,则 快捷方式虽然仍可存在,但是调用时会出 错。
代理模式的时序
执行了一个preRequest()操作,然后把 请求传递个真实主题。在真实主题将请求 返回后,代理主题又执行了一个 podtRequest()操作,才将控制返回个客 户端。
数据库事务与并发
数据库事务是指由一个或者多个SQL语 句组成的工作单元,在这个工作单元中 SQL语句相互依赖,如果有一个SQL语句 执行失败,就必须撤销整个单元。在并 发的环境中,当多个事务同时访问相同 的数据资源时,可能会造成各种并发问 题。
在现实生活中,事务是指一组相互依 赖的操作行为。如银行交易、股票交 易或网上购物。
数据库事务必须具备的ACID特性,ACID是 Atomic(原子性),Consistency(一致性), Isolation(隔离性)和Durability(持久性)的英文缩 写。下面解释这几个特性的含义。 原子性:指整个数据库事务是不可分割的工 作单元。只有事务中所有的操作执行成功,才 算整个事务成功;事务中的任何一个SQL语句 执行失败,那么已经执行成功的 SQL语句页必须撤销,数据库状态应该退回到 执行事务之前的状态。
代理模式的结构
代理模式所涉及的角色有: 1.抽象主题角色:声明了真实主题和代 理主题的共同接口,这样一来在任何可以 使用真实主题的地方都可以使用代理主题。
Proxy(代理)模式

设计模式----Proxy(代理)模式GOF:为其他对象提供一种代理以控制对这个对象的访问。
和Flyweight不一样Proxy本身就是代理的意思。
对一个对象进行访问控制的原因是,当我们确实需要这个对象,或者这个对象的某些功能后才去使用它。
在一个论坛系统中(比如说非常著名的“天涯社区”)来说,浏览该论坛的有两种基本用户,一种是注册用户:可以发表文章,修改自己发表的文章,删除自己的文章,回复别人的文章等。
另一种是游客(非注册用户):只有看文章的权限。
在这样的系统中就可以用Proxy模式来代理控制这样两种用户的权限。
根据我在各种参考资料上看到的内容,Proxy模式还有许多变种,他适用于很多地方。
在GOF的书中,阐述了如下使用Proxy模式的情景:1.远程代理(Remote Proxy):为一个对象在不同地址空间提供局部代表。
2.虚代理(Virtua Proxy):根据需要创建开销很大的对象。
比如说,在网站上看图片,一般都先显示小图片,想看大图片的时候可以点击小图片。
3.保护代理(Protection Proxy):控制对原始对象的访问。
保护代理用于对象应该有不同的访问权限的时候。
例如我们上面提到的论坛系统。
4.智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
他的典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放他(也称为Smart Pointers。
这个好像在C++中有专门的讲解);当第一次引用一个持久对象时,将他装入内存;在访问一个实际对象前,检查是否已经锁定了他,以确保其他对象不能改变他。
举一个简单的例子来说明Proxy模式。
在娱乐圈里明星要演出,要做广告这些事情都不是明星自己和商家谈,而是有一个自己的经济人,这个经济人就代理这个明星的一切外事活动。
比如说和某某电影公司签约阿,或者和某厂家签约广告啊什么的。
这个经济人就是个代理的脚色,他和商家谈判的时候觉得可行就让明星去演出或去拍广告,如果谈判不行他就取消该商家和该明星的联系活动,一定程度上来说他控制者明星的活动。
.NET中的设计模式---代理模式(Proxy)

.NET中的设计模式---代理模式(Proxy) ⼀个称职的代理⼈是什么呢?显然它不仅要向客户提供供应者完善的服务,也要对这种服务进⾏有效的控制,同时⼜要⽅便客户使⽤。
设计模式中的代理模式正式要充当这个代理⼈,那么.NET中该如何实现该代理⼈呢?且看下⽂。
代理模式是GOF23种设计模式中结构型模式之⼀,意图是为其他对象提供⼀种代理以控制对这个对象的访问,UML类图如下:图1由此图也许我们看不出代理模式意图要表达真实意思,那么我们在看⼀副图,如下:图2由此图联系其意图,我们不难理解代理模式的意图了。
图中aClient是客户,要访问aRealSubject对象,然⽽由于某种原因我们需要对这种访问进⾏控制。
因此我们引⼊了代理aProxy,代理aProxy提供了⼀个虚拟的aRealSubject供aClient访问,并且能够对这种访问进⾏控制,⽽对aClient来说,这个虚拟的对象与真实的对象完全⼀样。
上⾯我们明⽩了什么是代理模式,那么在.NET中如何实现呢?根据图1也许你能很快写出⼀段⽰例代码,<C#设计模式>⼀书中就是这么实现的。
但是⽰例代码并不能解决我们的实际问题,我们也并不需要关注UML图中的每⼀个细节,更不⼀定必须按UML图中的结构类实现。
那么在实际.NET开发中该如何实现代理模式呢?幸运的是微软在.NET中为我们提供了实现代理模式的基本框架,我们稍作改动即可在代码中直接使⽤。
.NET中与实现代理模式有关的类有以下⼏个:1. ContextBoundObject:定义所有上下⽂邦定类的基类;2. RealProxy:提供代理的基本功能;3. ProxyAttribute:指⽰对象类型需要⾃定义代理; 如果我们要定义⼀个需要被代理的类,那么仅需要从ContextBoundObject继承即可,如下:[ProxyTag]public class RealClass : ContextBoundObject {public RealClass() {Console.WriteLine("构造⼀个RealClass!");}} 如果要为RealClass定义代理,那么需要从RealProxy继承⾃⼰的代理类,并重载Invoke⽅法:public override IMessage Invoke(IMessage msg) {//⾃定义构造对象前进⾏处理PreProcess(msg);IMessage retMsg=null;if (msg is IConstructionCallMessage) {IConstructionCallMessage ccm = (IConstructionCallMessage)msg;retMsg = EnterpriseServicesHelper.CreateConstructionReturnMessage(ccm, (MarshalByRefObject)this.GetTransparentProxy());}//⾃定义构造对象后进⾏处理PostProcess(retMsg);return retMsg;} 在定义完代理类后,需要定义⼆者关联的Attribute,才能完成需要的代理,此时需要从ProxyAttribute继承实现⾃⼰的标签,并重载CreateInstance⽅法:public override MarshalByRefObject CreateInstance(Type serverType) {MarshalByRefObject mobj = base.CreateInstance(serverType);if (aspectManaged) {RealProxy realProxy = new ProxyClass(serverType, mobj);MarshalByRefObject retobj = realProxy.GetTransparentProxy() as MarshalByRefObject;return retobj;}else {return mobj;}} 经过以上步骤,我们就完成了⼀个可以直接使⽤的代理类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DynamicSubject
• • • • • •
public class DynamicSubject implements InvocationHandler { private Object sub; public DynamicSubject(Object obj) { sub = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
代理类 InvocationHandler ds = new DynamicSubject(rs); // 初始化代理类 Class cls = rs.getClass(); Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.ge tInterfaces(),ds); subject.request(); } }
代理模式-初步了解
• 六子 取钱 • 六子 ATM 取钱 • 六子 银行卡 ATM 取钱 • 六子不能直接操作ATM,但是可以通过 六子不能直接操作ATM,但是可以通过
(银行卡)操作ATM,(银行卡)就是代 (银行卡)操作ATM,(银行卡)就是代 理者. 理者.
代理模式-初步了解
• • • • • • •
类图
MyForum
AddFile()
MyForumReal
AddFile()
பைடு நூலகம்
MyForumProxy
AddFile() MyForumProxy()
抽象主题角色
首先我们先实现一个抽象主题角色MyForum, 首先我们先实现一个抽象主题角色MyForum, 里面定义了真实主题和代理主题的共同接 口—发帖功能。 public interface MyForum •{
什么时候要使用代理模式呢?
• 在对已有的方法进行使用的时候出现需要
对原有方法进行改进或者修改 • 这时候有两种改进选择: • 1:修改原有方法来适应现在的使用方式, 1:修改原有方法来适应现在的使用方式, • 2:使用一个“第三者”方法来调用原有的方 2:使用一个“第三者” 法并且对方法产生的结果进行一定的控制。 (开闭原则)对扩展开放、对修改关闭”。 (开闭原则)对扩展开放、对修改关闭”
public void AddFile();
•}
真实主题角色
• public class MyForumReal implements
MyForum { • public void AddFile() { • System.out.println("可以增加帖子! System.out.println("可以增加帖子! "); • } •}
");
• } •}
• public class Client { • public static void main(String[] args) { • //在 RealSubject rs = new RealSubject(); //在 • • • • • • • • • • •
这里指定被代理类 InvocationHandler ds = new //初始化代理类 DynamicSubject(rs); //初始化代理类 Class cls = rs.getClass(); Subject subject = (Subject)Proxy.newProxyInstance(cls.getClassLoader (),cls.getInterfaces(),ds); subject.request(); TT tt = new TT(); //初始化代 ds = new DynamicSubject(tt); //初始化代 理类 cls = rs.getClass(); subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.ge tInterfaces(),ds); subject.request(); } }
代理模式种类
• 3. 保护(Protect or Access)代理:控制对一个 保护(Protect Access)代理:控制对一个
对象的访问权限。比如:在论坛中,不同的身份 登陆,拥有的权限是不同的,使用代理模式可以 控制权限(当然,使用别的方式也可以实现)。 4. 智能引用(Smart Reference)代理:提供比对 智能引用(Smart Reference)代理:提供比对 目标对象额外的服务。比如:纪录访问的流量 (这是个再简单不过的例子),提供一些友情提 示等等。
他对象提供一种代理以控制对这个对象的 访问。说白了就是,在一些情况下客户不 访问。说白了就是,在一些情况下客户不 想或者不能直接引用一个对象, 想或者不能直接引用一个对象,而代理对 象可以在客户和目标对象之间起到中介作 用,去掉客户不能看到的内容和服务或者 增添客户需要的额外服务。 增添客户需要的额外服务。
Subject
• public interface Subject { • abstract public void request(); •}
RealSubject
• public class RealSubject implements
Subject{ • public void request() •{ • System.out.println("调用RealSubject!"); System.out.println("调用RealSubject! •} •}
结果输出: 结果输出:
• --------------------------------------------------• 调用RealSubject! 调用RealSubject!
再加一个类
• public class TT implements Subject{ • public void request() • { • System.out.println("TT............! System.out.println("TT............!
Java的动态代理类 Java的动态代理类
• 所谓Dynamic Proxy是这样一种class:它是在运行 所谓Dynamic Proxy是这样一种class:它是在运行
时生成的class,在生成它时你必须提供一组 时生成的class,在生成它时你必须提供一组 interface给它,然后该class就宣称它实现了这些 interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些 interface。你当然可以把该class的实例当作这些 interface中的任何一个来用。当然啦,这个 interface中的任何一个来用。当然啦,这个 Dynamic Proxy其实就是一个Proxy,它不会替你 Proxy其实就是一个Proxy,它不会替你 作实质性的工作,在生成它的实例时你必须提供 一个handler,由它接管实际的工作。在使用动态 一个handler,由它接管实际的工作。在使用动态 代理类时,我们必须实现InvocationHandler接口, 代理类时,我们必须实现InvocationHandler接口,
– method.invoke(sub, args); – return null;
• • }
}
Test
• public class Test { • public static void main(String[] args) { • RealSubject rs = new RealSubject(); //在这里指定被 //在这里指定被 • • • • • •
•
代理模式最简单的结构
代理模式就有三个角色组成了: 1.抽象主题角色:声明了真实主题和代理主题的共同接口。 2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角 色相同的接口。 3.真实主题角色:定义真实的对象。
论坛例子
• 以论坛中已注册用户和游客的权限不同来
作为第一个例子: • 已注册的用户拥有发帖,修改自己的注册 信息,修改自己的帖子等功能; • 而游客只能看到别人发的帖子,没有其他 权限。
测试类
• public class Test { • public static void main(String[] args) { • MyForumProxy proxy =new • • •}
MyForumProxy(0); proxy.AddFile(); }
总结
代理模式能够协调调用者和被调用者,能 够在一定程度上降低系统的耦合度。不过 一定要记住前面讲的使用代理模式的条件, 不然的话使用了代理模式不但不会有好的 效果,说不定还会出问题的
当然还有别的也可以, 六子 乙炔喷枪 ATM 取钱 乙炔喷枪 (乙炔喷枪)就是代理者. 乙炔喷枪)就是代理者. ~这时候是犯罪了.国家要抓六子 国家 抓六子 国家没法直接抓六子,(警察)就是代理者 国家没法直接抓六子,(警察)就是代理者 国家 警察 抓六子
代理模式代理模式-定义
• 代理模式在设计模式中的定义就是:为其
Java的动态代理类 Java的动态代理类
• Java动态代理类位于ng.reflect包下,一般 Java动态代理类位于ng.reflect包下,一般 • • • • • •
主要涉及到以下类: (1). Interface InvocationHandler: InvocationHandler: 该接口中仅定义了一个方法Object: 该接口中仅定义了一个方法Object: invoke(Object obj,Method method,Object[] args) 在实际使用时, 第一个参数obj一般是指代理类, 第一个参数obj一般是指代理类, method是被代理的方法,如例中的request(), method是被代理的方法,如例中的request(), args为该方法的参数数组。 args为该方法的参数数组。 这个抽象方法在代理类中动态实现。