适配器模式
将一个类的接口转换为客户需求的接口。分为类模式和对象模式
类模式
使用继承机制完成接口的转换,从目标类与被适配者继承来,在适配器中完成接口的转换。
对象模式
使用内部对象指针完成接口的转换,继承目标类对虚函数接口进行重写,被适配对象指针在适配器中,被适配器调用。
#include <iostream>
#ifndef _DESIGN_PATTERN_ADAPTOR_ADAPTER_HPP_
#define _DESIGN_PATTERN_ADAPTOR_ADAPTER_HPP_
namespace design_pattern
{
class Target
{
public:
virtual ~Target() {}
virtual void Operation() { std::cout << "Target : Operation()" << std::endl; }
};
class Adaptee
{
public:
void SpecificOperation() { std::cout << "Adaptee : SpecificOperation()" << std::endl; }
};
class CAdapter : public Target, public Adaptee
{
public:
void Operation()
{
(dynamic_cast<Adaptee *>(this))->SpecificOperation();
}
};
class OAdapter : public Target
{
private:
Adaptee *padt_;
public:
void set_padt(Adaptee *const ptr)
{
padt_ = ptr;
}
void Operation()
{
padt_->SpecificOperation();
}
};
}
#endif //!_DESIGN_PATTERN_ADAPTOR_ADAPTER_HPP_
//adaptor_main.cpp
#include "adapter.hpp"
using namespace design_pattern;
int main()
{
CAdapter a;
Target *ptr = dynamic_cast<Target *>(&a);
ptr->Operation();
Adaptee adt;
OAdapter o;
o.set_padt(&adt);
ptr = dynamic_cast<Target *>(&o);
ptr->Operation();
return 0;
}
UML tips
UML面向对象相关定义:
- 泛化:当从基类派生子类时,称为对基类的泛化。
- 实现:从接口继承可实例化的派生类时,称实现。
- 依赖:非常弱的一种关系,当函数调用时使用到相关的类时,称依赖与这个类。
- 关联:关联线条的两端表示数量的多少,即当类A中的属性类型有类B时,两者有关联。
- 聚合:是关联的一种,A has a B, 但B不用定属于A,两者生命周期独立。
- 组合:是关联的一种, A contain B, B与A的生命周期一致。