概述
- 通常情况下,客户端可以通过目标类的接口访问它所提供的服务。有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。
- 在这种情况下,现有的接口需要转化为客户类期望的接口,这样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。
- 在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(
Adaptee
),即被适配的类。- 适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。这就是适配器模式的模式动机。
定义
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为
包装器(Wrapper)
。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
角色
Target:
目标抽象类Adapter:
适配器类Adaptee:
适配者类Client:
客户类
场景
- 要使用现有的类,并且其接口与您需要的接口不匹配
- 您想要创建一个可重用的类,该类与不一定具有兼容接口的类配合使用
实现
类适配器
1 2 3 4 5 6 7 8 9 |
//抽象目标类 //定义客户端使用的特定接口 class Target { public: virtual ~Target() {} virtual void request() = 0; //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//适配者类 //所有请求都委托给Adaptee,后者定义了需要调整的现有接口 class Adaptee { public: ~Adaptee() {} void specificRequest() { std::cout << "specific request" << std::endl; } //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//适配器类 //实现目标接口并让Adaptee响应 //通过扩展两个类来请求目标 //即使Adaptee的界面适应Target界面 class Adapter : public Target,private Adaptee { public: virtual void request() { specificRequest(); } //... }; |
1 2 3 4 5 6 7 8 |
auto main()->int { Target * t = new Adapter(); t->request(); delete t; return 0; } |
对象适配器
1 2 3 4 5 6 7 8 9 |
//抽象目标类 //定义客户端使用的特定接口 class Target { public: virtual ~Target() {} virtual void request() = 0; //... }; |
1 2 3 4 5 6 7 8 9 |
class Adaptee { public: void specificRequest() { std::cout << "specific request" << std::endl; } //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Adapter : public Target { public: Adapter() : adaptee() {} ~Adapter() { delete adaptee; } void request() { adaptee->specificRequest(); //... } //... private: Adaptee * adaptee; //... } |
1 2 3 4 5 6 7 8 |
auto main()->int { Target * t = new Adapter(); t->request(); delete t; return 0; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 结构型:享元模式09/24
- ♥ 行为型:解释器模式09/25
- ♥ 结构型:装饰器模式09/19
- ♥ 创建型:单例模式05/16
- ♥ 行为型:策略模式09/07
- ♥ 行为型:迭代器模式09/07