代理模式:
总结自:http://c.biancheng.net/view/1359.html
概述
- 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。
优缺点
-
代理模式的主要优点有:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能;
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
-
其主要缺点是:
- 代理模式会造成系统设计中类的数量增加
- 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
- 增加了系统的复杂度;
结构:
- 代理模式的主要角色如下。
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口(继承抽象类),其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
- 这个图还是能看懂一些的。
代码示例(Java):
- 可见抽象类Subject,定义了Request,C++中可以声明为纯虚函数。
- 真实主题继承了这个抽象类,是重要的对象,实现了Request()。
- 而代理类,同样继承了这个抽象类,同时还包含一个private的真实主题类的成员,实现Request中可以添加一些操作,最终内部核心还是调用了RealSubject的函数。
void main(String[] args) { Proxy proxy = new Proxy(); proxy.Request(); } //抽象主题 interface Subject { void Request(); } //真实主题 class RealSubject implements Subject { public void Request() { System.out.println("访问真实主题方法..."); } } //代理 class Proxy implements Subject { private RealSubject realSubject; public void Request() { if (realSubject == null) { realSubject = new RealSubject(); } preRequest(); realSubject.Request(); postRequest(); } public void preRequest() { System.out.println("访问真实主题之前的预处理。"); } public void postRequest() { System.out.println("访问真实主题之后的后续处理。"); } }
适配器模式:
-
代理模式是为其他类提供一种代理以控制对这个类的访问。我们不直接去接触目标类,而是直接操作代理类,代理类再去操作目标类。因为不直接接触目标类,因此我们可以在代理类的同名方法中添加或删除功能模块,而不用去修改目标类的原方法。
-
而适配器模式则主要是协调现实与需求的差异,减少对已有代码的改动,适配不同的接口、类类型。项目实施中可能会出现这样的情况:当前已完成的项目的某一个包内的各个类实现了一些特定的接口,而客户提出了新的需求,要求实现他所指定的那些接口(抛弃原有的方法或接口),但其业务细节却是相同、完全一样的。
-
最近在看STL才想起来之前写过代理模式,所以来补充适配器模式。C++ STL中的stack,queue就是以deque双端队列为基础,进行了封装实现栈和队列的功能。