适配器模式:

  将某个类的接口转换成客户端期望的另一个接口表示,主要的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。如读卡器是作为内存卡和笔记本之间的适配器,需要将内存卡插入读卡器,再将读卡器插入笔记本,这样笔记本就可以读取内存卡了。

适配器模式的主要角色:

  1. 目标接口(Target):当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者类(Adaptee):被访问和适配的现存组件库中的组件接口。
  3. 适配器类(Adapter):转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

分类:

适配器模式主要分三类:

  • 类适配器模式、
  • 对象适配器模式、
  • 接口适配器模式。

优点:

  1、客户端通过适配器可以透明地调用目标接口。

  2、复用了现存的类,开发人员不需要修改原有代码而重用现有的适配者类。

  3、将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

缺点:

  1、对类适配器来说,更换适配器的实现过程比较复杂。

  2、过多的适配器,会让系统零乱,不易整体进行把握。

类适配器模式

    当前去外地出差,工作繁忙,回到宾馆也不得不工作。当你拿出电脑,准备接电源,卧槽…不支持!!!电源是两孔的,而插座是三孔的,怎么办呢?你会想到去楼下小商店买个转换插座,将三孔插座转成两孔的来用,简直太聪明了。

class ThreePhaseOutlet
{
public:
	void doThreePhasePlugin()
	{
		cout<<"三相插头强势插入!"<<endl;
	}
};

class TwoPhaseOutlet 
{
public:
	virtual void doPlugin() = 0;
};
class OutletConvertor: public TwoPhaseOutlet,public ThreePhaseOutlet
{
public:
	void doPlugin()
	{
		doConvertor();
		doThreePhasePlugin();
	}	
        void doConvertor()
	{
		cout<<"三相插头转为两厢插头!"<<endl;
	}
};

对象适配器模式

    当手机没电需要充电,你不可能直接使用220V的电压,如果你真这么做了,请注意人身安全及购买一台新机。此时,充电器就起到了转换器的作用,将220V电压转换成手机可使用的5V电压。

class OutletConvertor : public TwoPhaseOutlet
{
public:
	OutletConvertor(ThreePhaseOutlet out)
	{
		m_out = out;
	}
	void doPlugin()
	{
		doConvertor();
		m_out.doThreePhasePlugin();
	}
	void doConvertor()
	{
		cout<<"三相插头转为两厢插头!"<<endl;
	}
	ThreePhaseOutlet m_out;
};

接口适配器模式