适配器模式:
将某个类的接口转换成客户端期望的另一个接口表示,主要的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。如读卡器是作为内存卡和笔记本之间的适配器,需要将内存卡插入读卡器,再将读卡器插入笔记本,这样笔记本就可以读取内存卡了。
适配器模式的主要角色:
- 目标接口(Target):当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者类(Adaptee):被访问和适配的现存组件库中的组件接口。
- 适配器类(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;
};