适配器模式,又叫Adapter模式,属于接口隔离模式的一种,常用于framework中新老接口的更新。

定义

将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 — 《设计模式》 GoF

模式动机

在软件系统中,通常可以使用目标类的接口访问它所提供的服务,但是有时现有的类的实现可以满足客户的需要但是接口并不能满足客户的需求,这可能是现有类的方法名称与目标类的方法名不一致导致的,因此这时候就需要使用适配器模式,将现有类的接口转化为客户需要的类的接口,这个包装的类就叫适配器,它所包装的类叫被适配的类。

日常生活中也有这样的例子,如电源适配器,将220V的AC转换为12V的DC,等等

模式分析

  • Target:目标接口
  • Adapter:适配器类,包装原有接口,重写目标接口的方法,类中组合了一个适配者类,这种适配器模式叫对象适配器,相比于类适配器更加灵活
  • Adaptee:适配者类
  • Client:客户类

代码分析

旧接口

class IAdaptee
{
public:
	IAdaptee();
	~IAdaptee();

	virtual void step1() = 0;
	virtual void step2() = 0;
};

旧接口的具体实现

class OldClass : public IAdaptee
{
public:
	OldClass();
	~OldClass();

	virtual void step1();
	virtual void step2();
};

void OldClass::step1()
{
	std::cout << "step 1 running \n";
}

void OldClass::step2()
{
	std::cout << "step 2 running \n";
}

目标接口

class ITarget
{
public:
	ITarget();
	virtual ~ITarget() = 0;
	virtual void process() = 0;
};

适配器

class IAdapter : public ITarget
{
	IAdaptee *adaptee;
public:
	IAdapter(IAdaptee *adaptee);
	~IAdapter();

	virtual void process();
};

IAdapter::IAdapter(IAdaptee *adaptee)
{
	this->adaptee = adaptee;
}

void IAdapter::process()
{
	adaptee->step1();
	adaptee->step2();
}

main函数

int main()
{
	IAdaptee *adaptee = new OldClass;
	ITarget *target = new IAdapter(adaptee);
	target->process();
}
  • 运行结果

  • 在main函数中指定具体的实现,达到晚绑定的效果
  • 适配器类继承目标接口,组合旧的接口,调用旧接口的方法重写新的接口函数,实现接口的转换

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

设计模式概述 上一篇
享元模式 下一篇