介绍
作用: 作为两个不兼容接口之间的桥梁,属于结构型模式.
何时使用:
- 系统需要使用现有类,但是该类的接口并不符合系统的要求;
- 通过接口转换,将一个类插入到另一个类中.
关键方案: 继承或依赖(推荐).
优点:
- 可以将现有的类转换成系统可以使用类;
- 提高了类的复用;
- 增加类的透明度
缺点:
- 过多地使用适配器,或让系统非常凌乱
UML
示例
组合实现适配器:
//双端队列,需适配的对象
class Deque{
public:
void push_back(int x);
void push_front(int x);
void pop_back();
void pop_front();
};
//接口,向外暴露
class Sequence{
public:
virtual void push(int x) = 0;
virtual void pop() = 0;
}
//单端队列
class Queue : public Sequence{
public:
void push(int x) override {
deque_.push_back(x);
}
void pop() override {
deque_.pop_front();
}
private:
Deque deque_;
};
这个是组合实现的适配器,还可以使用继承,不过因为继承的强依赖性,一般会推荐使用组合来实现 :
//双端队列
class Deque{
public:
void push_back(int x);
void push_front(int x);
void pop_back();
void pop_front();
};
class Sequence{
public:
virtual void push(int x) = 0;
virtual void pop() = 0;
}
//单端队列
class Queue : public Deque, public Sequence {
public:
void push(int x) override {
push_back(x);
}
void pop() override {
pop_front();
}
};
适配器模式/装饰模式/代理模式的区别?
- 适配器的特点在于兼容: 是将一个类(a)通过某种方式转换成另一个类(b);
- 装饰器模式特点在于增强: 在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b);
- 代理模式的特点在于隔离: 将一个类(a)转换成具体的操作类(b) .