适配器模式(C++)

简述

适配器模式可以将一个类的接口转化为客户希望的接口,使原本不兼容不能一起工作的类可以一起工作它可以分为类适配器模式和对象适配器模式。想使用一个已经存在的类,但如果它的接口实现的功能正是我们想要的但是调用方式不同,也就是使用它的方法和你的要求不相同时,就应该考虑用适配器模式,在适配器内部进行处理。

场景说明

出国旅游时,国外的景点简介都是英文的,如果不会英文就看不懂,这时候就需要一个翻译,通常是导游将英文翻译成中文解释给我们听,我们才能使用这个信息。

UML类图

类适配器


对象适配器


对象职责

tourist:游客,也就是目标接口类,需要使用ScenicSpot类的接口获取信息
ScenicSpot:景点信息,需要适配的类,
Translate:翻译者也是适配器类,负责把ScenicSpot类经过处理后,供tourist调用


代码实现

//目标
class tourist
{
public:
	std::string KnowScenicSpotChain(){}

	std::string mDataChain;
};

//适配
class ScenicSpot
{
public:
	std::string KnowScenicSpotEnglish()
	{
		std::string dataEnglish("this is Eiffel Tower");

		return dataEnglish;
	}

};

//类适配器
class Translate : public tourist, public ScenicSpot
{
public:
	std::string KnowScenicSpotChain()
	{
		std::string dataEnglish = KnowScenicSpotEnglish();

		//把英文翻译成中文
		std::string dataChain("这是埃菲尔铁塔");

		mDataChain = dataChain;
	}
};

//对象适配器
class Translate : public tourist
{
public:
	std::string KnowScenicSpotChain()
	{
		std::string dataEnglish = mScenicSpot->KnowScenicSpotEnglish();
		//把英文翻译成中文
		std::string dataChain("这是埃菲尔铁塔");

		mDataChain = dataChain;
	}

public: 
	ScenicSpot* mScenicSpot;

};


### C++ 中适配器设计模式的代码示例 适配器模式(Adapter Pattern)用于使两个不兼容接口能够一起工作。该模式通过创建一个新的类来作为两者之间的桥梁,从而允许原本由于接口不匹配而无法协同工作的对象可以共同协作。 下面是一个简单的例子,在这个例子中有一个现有的 `Target` 接口和一个已经存在的但是不符合 `Target` 所需接口的对象 `Adaptee`。为了使得 `Adaptee` 能够被当作 `Target` 使用,定义了一个新的 `Adapter` 类[^1]: ```cpp #include <iostream> using namespace std; // Target interface which client uses. class Target { public: virtual void request() const = 0; }; // Adaptee class with incompatible interface. class Adaptee { public: void specificRequest() const { cout << "Called Specific Request\n"; } }; // Adapter makes the Adaptee's interface compatible with the Target's. class Adapter : public Target { private: Adaptee* adaptee; public: Adapter(Adaptee* adpt) : adaptee(adpt) {} void request() const override { // Call Adaptee's method here to fulfill Target contract. adaptee->specificRequest(); } }; int main(){ Adaptee *adaptee = new Adaptee(); Target* target = new Adapter(adaptee); // Client calls methods on Target object without knowing it is actually an adapter. target->request(); delete adaptee; delete target; } ``` 在这个实现里,`Adapter` 继承自 `Target` 并持有指向 `Adaptee` 的指针成员变量。当调用者请求执行操作时,它实际上是在间接地让 `Adaptee` 完成相应的工作,但这一切对于客户端来说都是透明的[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值