适配器模式
定义:
将一个类的接口转成客户希望的另一个接口
优点:
(1)将目标类和适配器类解耦合
(2)提高类透明性和复用性
(3)扩展灵活性和扩展性
缺点:
(1)适配类成为最耦合部分
使用范围:
已存在目标类和适配者类,还需知晓二者的转换关系。
结构:
实现110v适配目标220v的案例:

实现:
适配模式(adapter_pattern)属于结构型模式(structural_pattern),所以定义了namespace structural_pattern的命名空间。
开发IDE:vs2015
C++11特性
类的定义声明如下:
namespace structural_pattern
{
class target220v
{
public:
virtual void charging_stand() = 0;
};
class target220v_china : public target220v
{
public:
virtual void charging_stand() override
{
std::cout << "适配中国220v电压电器" << std::endl;
}
};
class adapter110v
{
public:
virtual void charging() = 0;
};
class adapter_pattern : public adapter110v
{
public:
virtual void charging() override
{
std::cout << "提供美国电压110v" << std::endl;
std::unique_ptr<target220v> temp{ new target220v_china };
to220v = std::move(temp);
to220v->charging_stand();
}
private:
std::unique_ptr<target220v> to220v;
};
}
测试:
基于GoogleTest 的单元测试框架;框架可参考如下网址:
https://www.cnblogs.com/jycboy/p/gtest_catalog.html
using namespace structural_pattern;
TEST(test_adapter_pattern_charging, success_charge)
{
std::unique_ptr<adapter110v> adapter{ new adapter_pattern()};
adapter->charging();
}
总结
(1)适配类是继承目标类,增加适配者的成员变量
(2)考虑到适配者的扩展性,最好以抽象代替细节
(3)双向适配情况,适配类需继承目标类和适配者类(多继承)
(4)适配类用has a来调用适配者类比is a更解耦合(合成复用原则)