设计模式---适配器模式

86 阅读2分钟

定义

适配器模式(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 方法,并在其内部调用 oldPrinteroldPrint 方法。
    • 持有一个 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::moveoldPrinter 的所有权转移到 PrinterAdapter 的构造函数中。
  • 客户端代码

    • clientCode 函数接收一个 Printer 对象并调用其 print 方法,演示了适配器模式的使用。
    • printer.get() 返回 std::unique_ptr<Printer> 所管理对象的原始指针。这样,客户端代码可以像处理普通指针一样使用它。

应用场景

  • 需要使用一个已经存在的类,但它的接口与其他代码不兼容。

  • 需要创建一个可以复用的类,该类可以与不相关或不可预测的类(即这些类的接口不兼容)协同工作。