定义
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器模式使得原本由于接口不兼容而无法在一起工作的类可以一起工作。
特点
-
将一个类的接口转换成客户端希望的另一个接口。
-
使得原本由于接口不兼容而不能一起工作的类可以一起工作。
代码示例
# include <iostream>
# include <memory>
// 旧打印机接口
class OldPrinter
{
public:
void oldPrint()
{
std::cout << "Printing using old printer." << std::endl;
}
};
// 新打印机接口
class Printer
{
public:
virtual void print() = 0;
virtual ~Printer() = default;
};
// 适配器类,使得新接口可以用旧接口的实现
class PrinterAdapter : public Printer
{
private:
std::unique_ptr<OldPrinter> oldPrinter;
public:
PrinterAdapter(std::unique_ptr<OldPrinter> oldPrinter)
: oldPrinter(std::move(oldPrinter)) {}
void print() override
{
oldPrinter->oldPrint();
}
};
// 客户端
void clientCode(Printer* printer)
{
printer->print();
}
int main()
{
std::unique_ptr<OldPrinter> oldPrinter = std::make_unique<OldPrinter>();
std::unique_ptr<Printer> printer = std::make_unique<PrinterAdapter>(std::move(oldPrinter));
clientCode(printer.get());
system("pause");
return 0;
}
-
旧接口 (
OldPrinter类) :- 包含一个名为
oldPrint的方法,模拟旧打印机的打印功能。
- 包含一个名为
-
新接口 (
Printer类) :- 一个抽象基类,包含一个纯虚函数
print,定义了新打印机的接口。
- 一个抽象基类,包含一个纯虚函数
-
适配器类 (
PrinterAdapter类) :- 继承自
Printer类,实现了print方法,并在其内部调用oldPrinter的oldPrint方法。 - 持有一个
OldPrinter对象的智能指针,通过构造函数初始化该指针。
- 继承自
-
使用
std::move转移所有权:std::unique_ptr<OldPrinter> oldPrinter = std::make_unique<OldPrinter>();创建一个OldPrinter对象的智能指针。std::unique_ptr<Printer> printer = std::make_unique<PrinterAdapter>(std::move(oldPrinter));使用std::move将oldPrinter的所有权转移到PrinterAdapter的构造函数中。
-
客户端代码:
clientCode函数接收一个Printer对象并调用其print方法,演示了适配器模式的使用。printer.get()返回std::unique_ptr<Printer>所管理对象的原始指针。这样,客户端代码可以像处理普通指针一样使用它。
应用场景
-
需要使用一个已经存在的类,但它的接口与其他代码不兼容。
-
需要创建一个可以复用的类,该类可以与不相关或不可预测的类(即这些类的接口不兼容)协同工作。