【设计模式】 适配器模式 (c++实现)

适配器:把客户类的请求转化为对适配者的相应的接口的调用。
当客户类调用适配器中的方法时,在适配器中将调用适配者的方法。

根据适配器类与适配者类的不同:

适配器可以分为类适配器或者对象适配器。
在对象适配器中,适配器与适配者之间是关联关系
在类适配器中,适配器与适配者之间是继承关系
在实际开发中,对象适配器的使用频率更高

STL 中的适配器 stack ,queue list 都是适配器模式

对象适配器:

class Target
{
public:
	virtual void Request()
	{
		std::cout << "Target::Request" << std::endl;
	}
};
class Adaptee
{
public:
	virtual void NewRequest()
	{
		std::cout << "Adaptee::NewRequest" << std::endl;
	}
};
class AdapterObj :public Target
{
private:
	std::unique_ptr<Adaptee> adaptee_;
public:
	AdapterObj()
	{
		adaptee_.reset(new Adaptee());

	}
	void Request()
	{
		adaptee_->NewRequest();
	}

};
int main()
{
	std::unique_ptr<Target> pt(new Target());
	std::unique_ptr<Target> pt2(new AdapterObj());
	pt->Request();
	pt2->Request();
	return 0;
}

类适配器:

一个适配者:

class Target
{
public:
	virtual void Request()
	{
		std::cout << "Target::Request" << std::endl;
	}
};
class Adaptee
{
public:
	virtual void NewRequest()
	{
		std::cout << "Adaptee::NewRequest" << std::endl;
	}
};
class AdapterClass :public Target,private Adaptee
{
public:
	void Request()
	{
		Adaptee::NewRequest();
	}
	
};
int main()
{
	std::unique_ptr<Target> tg(new Target());
	std::unique_ptr<Target> tg2(new AdapterClass());
	tg->Request();
	tg2->Request();
}

多个适配者:

class Target 
{
public:
	virtual void request()
	{
		std::cout << "Target::request" << std::endl;
	}
	virtual ~Target()
	{
		std::cout << "~Target" << std::endl;
	}
};
class Adeptee 
{
public:
	virtual void NewRequest()
	{
		std::cout << "Adeptee::NewRequest" << std::endl;
	}
	~Adeptee() { std::cout << "~Adeptee" << std::endl; }
};
class Adeptee2
{
public:
	virtual void NewRequest()
	{
		std::cout << "Adeptee2::NewRequest" << std::endl;
	}
	~Adeptee2() { std::cout << "~Adeptee2" << std::endl; }
};
class Adeptee3
{
public:
	virtual void NewRequest()
	{
		std::cout << "Adeptee3::NewRequest" << std::endl;
	}
	~Adeptee3() { std::cout << "~Adeptee3" << std::endl; }
};
template<class Ada>
class Adepter : public Target, private Ada
{

public:
	Adepter() {  }
	virtual void request()
	{
		Ada::NewRequest();
	}
};
int main()
{
	std::unique_ptr<Target> pa(new Adepter<Adeptee>());
	std::unique_ptr<Target> pa2(new Adepter<Adeptee2>());
	std::unique_ptr<Target> pa3(new Adepter<Adeptee3>());
	pa->request();
	pa2->request();
	pa3->request();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值