适配器
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
动机
由于应用环境的变化,常常需要将「一些现存的对象」放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足。
适配器能够应对这种「迁移的变化」,既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口。
适用场景
有动机的修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
优点
1、可以让任何两个没有关联的类一起运行
2、提高了类的复用
3、增加了类的透明度
4、灵活性好
缺点
过多的使用适配器,会让系统显得很凌乱,不易整体把握。
结构图
代码
#pragma once#include <memory>namespace AdapterPattern {// ----------------- 适配器模式 -----------------// 遗留接口(老接口)class CAdaptee {public:virtual void mvFoo(int iData) = 0;virtual int miBar() = 0;};class COldAdaptee : public CAdaptee {public:virtual void mvFoo(int iData) override {}virtual int miBar() override { return 24; }};// 目标接口(新接口)class CTarget {public:virtual void mvProcess() = 0;};// 对象适配器class CAdapter : public CTarget {public:CAdapter(CAdaptee* opAdaptee) : mopAdaptee(opAdaptee) {}void mvProcess() {mopAdaptee->mvFoo(mopAdaptee->miBar());}private:CAdaptee* mopAdaptee; // 组合};void test() {std::unique_ptr<COldAdaptee> uq_old_adaptee = std::make_unique<COldAdaptee>();CAdapter adapter(uq_old_adaptee.get());adapter.mvProcess();}
}