您的位置:首页 > 编程语言 > C语言/C++

设计模式---适配器模式(C++实现)

2017-03-15 20:37 288 查看
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

意图

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

解决问题

主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

如何解决

继承或者依赖(推荐)

优点

1.可以让两个没有关联的类一起运行

2.提高了类的复用

3.增加了类的透明度

4.灵活性好

缺点

1.过多地使用适配器,会让系统非常零乱,不易整体进行把握。

 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类

注意事项

适配器不是在详细设计时添加的,而是解决正在服役的项目的问题

UML类图



由图中可以看出,Adaptee类没有Request方法,而客户期待这个方法。为了使客户能够使用Adaptee类,提供一个中间环节,即类Adapter类,Adapter类实现了Target接口,并继承自Adaptee,Adapter类的Request方法重新封装了Adaptee的SpecificRequest方法,实现了适配的目的。

C++简单实现

/*
目标(Target)角色:这是客户所期待的接口。因为C#不支持多继承,所以Target必须是接口,不可以是类。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:把源接口转换成目标接口。这一角色必须是类
*/

//适配器模式
class Target
{
public:
Target(){}
virtual void Request(){}
};

class Adaptee
{
public :
void SpecificRequest()
{
cout << "Called SpecifiReequest" << endl;
}
};
class Adapter : public Adaptee, public Target //适配器
{
public :
void Request()
{
this->SpecificRequest();
}
};

测试:

int test_Adapter()
{
Target *t = new Adapter();
t->Request();
delete t;
t = NULL;
return 0;
}

使用场景

1.系统需药使用现有的类,为此类的接口不符合系统的需要

2.想要建立一个可以重复使用的类,用于与彼此之间没有太大关联的一些类,包括可能在将来引进来的类一起
工作。

3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一
个子类做一个适配器,而这不太实际。

参考:
http://blog.csdn.net/lcl_data/article/details/8780140
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: