设计模式:适配器模式

适配器模式:

电压适配器能将220v的电压,调整到手机充电要求的的5v电压,所以称之为适配器。

1 在软件开发过程中,如果某个模块的功能开发起来非常困难,但是此前已经有相同功能的模块存在了,只是这两个模块的接口不一致,利用适配器模式就能够用目标接口封装好已经存在的接口,降低开发的难度。适配器模式可以实现对现有类(功能)的包装,直接使用,而不必重新开发。

2 调用者和提供者都不太容易修改的情况下,使用适配器模式。

3 适配器模式可以通过类的组合或者类的私有继承来实现。


类组合方式:对象适配器

#include<iostream>
using namespace std;
class Target{//含目标接口的类 
	public:
		virtual ~Target()=0;
		virtual void request()=0;
};
Target::~Target(){//纯虚析构函数必须定义! 
	
}
class Adaptee{//需要适配的类 
	public:
		void specialRequest(){
			cout<<"Adaptee::specialRequest()"<<endl;
		}
};
class Adapter:public Target{//适配器 
	public:
		Adapter(){
			pAdaptee=new Adaptee();
		}
		~Adapter(){
			delete pAdaptee;
			pAdaptee=NULL;
		} 
		void request() override{
			cout<<"Adapter::request()"<<endl;
			pAdaptee->specialRequest();
		}
	private:
		Adaptee* pAdaptee;
};
int main(){
	Target* aTarget=new Adapter();
	aTarget->request();
	delete aTarget;
	aTarget=NULL; 
}

私有继承方式:类适配器

#include<iostream>
using namespace std;
class Target{
	public:
		virtual ~Target()=0;
		virtual void request()=0;
};
Target::~Target(){//纯虚析构函数必须定义 
	
}
class Adaptee{
	public:
		void specialRequest() {
			cout<<"Adaptee::specialRequest()"<<endl;
		}
};
class Adapter:public Target,private Adaptee{
	public:
		void request() override{
			cout<<"Adapter::request()"<<endl;
			Adaptee::specialRequest();
		}
};
int main(){
	Target* aTarget=new Adapter();
	aTarget->request();
}


effective C++中提到能用组合(分层)或私有继承实现的话,就尽量使用组合的方式来实现。

1 采用私有继承,如果在Adaptee中添加一个纯虚函数,那么子类Adapter也要对这个纯虚函数进行重定义,这样子就增加了类的耦合。

2 私有继承时,Adapter类内无法对Adaptee的子类中的方法进行调用。而采用类的组合方式,可以在Adapter类内声明一个Adaptee的指针,通过动态绑定的方式调用Adaptee的子类。
所以,尽量使用类组合的对象适配器,而不是多继承的类适配器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值