代理模式
一 场景
在软件开发中,有时候需要访问远程jvm中的对象。我们可以在本地jvm中创建一个代理对象。用这个代理对象将网络细节封装起来,使得客户端不必考虑网络的存在。客户端访问远程jvm对象就像调用本地对象一样。这就是代理模式的远程代理。
有时候程序创建的一些对象,十分消耗系统资源,这些对象的加载时间很长。我们可以创建一个不耗资源的虚拟对象。在真实对象完成创建之前,我们使用虚拟对象来代替真实对象。这种创建虚拟对象临时代替真实对象的方式,就是代理模式的虚拟代理。
我们在访问的一些对象时,有时候需要进行一些权限的控制。其实可以专门创建一个新对象,把权限的控制的逻辑放到新对象中。这样程序就把权限控制和对象访问分开,实现了一定程度的解耦。这就是代理模式的保护代理。
二 定义
代理模式给一个对象提供一个替身或占位符,来控制对原对象的访问。代理模式是一种对象结构型模式。
三 类图
Subject(抽象主题类):抽象主题类是真实主题类和代理类的共同接口。通过实现同一接口,代理类可以在真实主题类出现任何地方取代它。
RealSubject(真实主题类):真实主题类是真正做事的对象,它实现了具体的业务逻辑操作。它是一个被代理类控制和访问的对象。
Proxy(代理类):代理类包含了对真实主题类的引用。由于它和真实主题类实现了相同的接口,所以在任何用到真实主题类的地方,都可以被代理类取代。代理类可以控制真实主题类的访问。客户端可以通过访问代理类,来间接调用真实主题类的操作。
四 代码示例
现在社会上代购十分流行,我们以代购为例,假设顾客需要购买某个商品。但是顾客所在的城市A没有这个商品。而顾客的好朋友所在的城市B却有这个商品。顾客就可以委托他的好友在城市B给他购买这个商品。然后朋友再通过物流托运给这个顾客。顾客托朋友的购物行为就是代购。
代购这种行为场景和代理模式十分吻合。顾客的好朋友是真正买东西的人。而顾客的购物行为其实是委托给了好友在买东西。
顾客和顾客的好友都具有购买的行为,所有定义了一个抽象的主题类的接口IShopping。接口中声明了一个buy方法。
顾客的好友其实就是代购,所以定义了Shopper类实现了IShopping接口。它是真实主题类。Shopper类中实现了IShopping接口的buy方法。Shopper类真正具有购买东西的行为。
顾客也有购买的行为,但是顾客的购买行为其实是委托给了好友来完成。我们定义了一个Customer类,也实现了IShopping接口。并在Customer类中声明了一个Shopper类的实例。Customer类在实现IShopping接口的buy方法时,其实是调用了Shopper实例的buy方法。
运行结果
五 总结
代理模式是一种对象结构型模式。它能将代理对象与真实被调用的目标对象分离。降低了系统的耦合性,同时具有很好的扩展性。
优点:
- 代理模式中代理类和真实主题类都是对抽象主题类进行编码,都实现了抽象主题的接口,而代理类和真实主题类并没有直接关联,从而降低了耦合性。
- 真实主题类中修改了代码的情况下,而代理类不需要跟着修改源代码,符合了“开闭原则”。
缺点:
- 在客户端和真实主题之间增加了代理类,因此有可能会造成请求的处理速度变慢。
- 实现代理模式需要增加一些额外的工作,而且有些代理模式的实现过程较为复杂。
标签:真实,对象,主题,代理,模式,接口,顾客 来源: https://www.cnblogs.com/YaoxTao/p/16164715.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。