适配器模式-C++代码实现

鉴于自己学适配器模式时是从书本中一行行文字看下来,然后是各种UML图各种迷糊各种不懂各种不够直接的苦逼过程,现在自己想从“有需求->解决方法->总结成模式”的方式来说说个人对适配器模式的理解。

首先是需求(当然是main函数啦):

void main()
{
	Target* client1 = new Target;	//客户需求是制造USB口,我们自己有这技术,能够制造,所以设计了Target类来制造USB口
	client1->make();
}
Target类:
class Target
{
public:
	virtual ~Target(){}
	virtual void make()
	{
		printf("制造USB口\n");
	}
};
一段时间后,某个 客户2需求增加了,额外需要一个PS2口(并不是所有客户),所以main就变成了下面这样:

void main()
{
	Target* client1 = new Target;	//所有客户原来的需求只是制造USB口,我们自己能够制造,所以设计了Target类来制造USB口
	client1->make();
	//没想到,过了一段时间后,客户又要求需要制造PS2口的,而我们技术不够不能自己制造,
	//于是,我们就只能引进Adaptee第三方库,但是客户只能用我们的Target类里的接口(这其中涉及到了版权等利益问题^_^)
	//可是Target类的接口make()与Adaptee里的makePS2()不兼容,直接用make就只能生产USB,我们又不希望在Target类里添加makePS2()方法,
	//因为别的很多只需要制造USB地方都用到了,所以我们不可能因为仅这个地方需要PS2口而去贸贸然修改Target类。
	//怎么办?这时候就可以用适配器模式了:
	//设计一个Adapter类,将一个类的接口转换成客户需要的另外一个接口,使得原来由于接口不兼容而导致不能一起工作的类可以协同工作(即Target和Adaptee)
	Target* client2 = new Adapter;
	client2->make();
}
引进的Adaptee类:

class Adaptee
{
public:
	virtual ~Adaptee(){}
	virtual void makePS2()
	{
		printf("制造PS2口\n");
	}
};
显然,这时候要么就是直接修改Target类,但是这方法绝对不会是我们想要的,没有哪个商家会为了某个客人的喜好而冒然改变该类商品。但又必须满足每个客户的要求,这时我们就要作出变动,为那个客户设计一个适配器类来满足其需求,实在是有点无奈啊!不过没办法,谁叫顾客是上帝呢!

所以有了下面的Adapter类:

//#define OBJECT_ADAPTER
//对象适配器模式
#ifdef OBJECT_ADAPTER
class Adapter:public Target
{
private:
	Adaptee* ps2;
public:
	Adapter(){
		ps2 = new Adaptee;
	}
	~Adapter(){
		if( NULL != ps2 )
		{
			delete ps2;
		}
	}
	void make(){
		printf("Use object-adapter pattern!\n");
		ps2->makePS2();
	}
};
#else
//类适配器模式
class Adapter:public Target,private Adaptee
{
public:
	void make()
	{
		printf("Use class-adapter pattern!\n");
		this->makePS2();
	}
};

有了这个适配器Adapter类,我们就能满足那个需要PS2口的客户的需求了,同时又不会影响到其他客户对Target类的需求,so nice!

个人感觉:设计模式只是一个参考,并不是要求必须用这个模式,只不过在这种情况下(这里只有某个客户需求,并不是绝大多数,所以短期内我们不想改变原有的Target类,又无法不使用第三方库的东西,这样就存在两个接口不兼容,而客户又希望还是通过原来的Target类接口来实现制造口,并不希望你提供另外一个新类)使用适配器模式或许会好点(如果贸然改变Target类,添加一个makePS2()接口,或许很多客户会咒骂我根本不要这东西,硬是塞给我浪费我空间哦!总之贸然改变提供给客户的类的接口,容易出现各种问题,不到逼不得已还是别了!)

追求的就是简单粗暴的分析。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值