• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

设计模式C++实现——适配器模式

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/walkerkalr/article/details/29863177

        适配器模式将一个类的接口。转换成客户期望的还有一个接口。适配器让原本接口不兼容的类能够合作无间。

        适配器能够分为类适配器和对象适配器。

        类适配器使用多重继承对一个接口与还有一个接口进行匹配。

        对象适配器依赖于对象组合。

 

客户使用适配器的过程:

1.      客户通过目标接口调用适配器的方法对适配器发出请求。

2.      适配器使用被适配者接口把请求转换成被施培者的一个或多个调用接口

3.      客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。

模式结构:

        类适配器


对象适配器


举例:

如今如果你缺少鸭子对象(叫声为Quack,飞行输出”I’m flying !”),想用一些火鸡对象(叫声为”Gobble gobble” 飞行输出”I’m flying a short distance!”)来冒充。显而易见。由于火鸡的接口(行为)不同,所以我们不能公然拿来使用。

UML设计:

编程实现及运行结果:

#include <iostream>

using namespace std;
//定义鸭子类
class Duck
{
public:
	virtual void quack(){};
	virtual void fly(){};
};
//定义绿头鸭
class MallardDuck : public Duck
{
public:
	void quack()
	{
		cout << "Quack" << endl;
	}

	void fly()
	{
		cout << "I'm flying" << endl;
	}
};
//定义火鸡
class Turkey
{
public:
	virtual void gobble(){}
	virtual void fly(){}
};
//定义野火鸡
class WildTurkey : public Turkey
{
public:
	void gobble()
	{
		cout << "Gobble gobble" << endl;
	}
	void fly()
	{
		cout << "I'm flying a short distance" << endl;
	}
};
//定义火鸡适配器
class TurkeyAdapter : public Duck
{
public:
	TurkeyAdapter(Turkey* tur):turkey(tur){}

	void quack()
	{
		turkey->gobble();
	}
	void fly()
	{
		turkey->fly();
	}
private:
	Turkey* turkey;  
};
//客户代码
int main()
{
	Duck* duck = new MallardDuck();
	duck->quack();
	duck->fly();

	Duck* turkeyAdapter = new TurkeyAdapter(new WildTurkey());
	turkeyAdapter->quack();
	turkeyAdapter->fly();
	return 0;
}


运行结果:

Quack

I'mflying

Gobblegobble

I'mflying a short distance

请按随意键继续. . .

 

适配器和装饰者模式比較:

适配器:将一个接口转成还有一个接口。包装某些对象,让它们的接口看起来不像自己而像别的东西。

装饰者:不改变接口,但增加责任。

将对象包装起来。让新行为增加类中。

 



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap