c++之桥接模式

桥接模式

定义:把抽象部分和它的实现部分分离,使得它们都可以独立的变化

栗子场景:华山派和崆峒派先后获得了武林秘籍辟邪剑谱和九阴真经,于是开始苦练此功..

UML类图

代码:

#include<iostream>

using namespace std;
class Sects;

//功夫
class Kungfu
{
public:
	virtual void practice() = 0;
};

//九阴真经
class JiuyinZj :public Kungfu
{
public:
	virtual void practice()
	{
		cout << "@九阴真经。注:玄门内功,至阴至柔" << endl;
	}
};

//辟邪剑谱
class PixieJp :public Kungfu
{
public:
	virtual void practice()
	{
		cout << "@辟邪剑谱,注:欲练此功,必先自宫" << endl;
	}
};


//门派 
class Sects{
public:
	Sects() :m_kungfu(nullptr){}

	void setMartialarts(Kungfu* m)
	{
		this->m_kungfu = m;
	}
	Kungfu* getKungfu()
	{
		return m_kungfu;
	}
	virtual void practice() = 0;
private:
	Kungfu *m_kungfu;	//桥接
};

//华山
class HuaShan :public Sects
{
public:
	void practice()
	{	
		getKungfu()->practice();
	}
};

//崆峒
class KongTong :public Sects
{
public:
	void practice()
	{
		getKungfu()->practice();
	}
};

//客户端
int main()
{
	Sects *sects = new HuaShan;
	cout << "华山派弟子正在练习:" << endl;
	sects->setMartialarts(new JiuyinZj);
	sects->practice();

	sects->setMartialarts(new PixieJp);
	sects->practice();

	sects = new KongTong;
	cout << "崆峒派弟子正在练习:" << endl;
	sects->setMartialarts(new JiuyinZj);
	sects->practice();

	sects->setMartialarts(new PixieJp);
	sects->practice();
	if (sects)
	{
		delete sects;
		sects = nullptr;
	}

	return 0;
}

效果:

桥接模式和抽象工厂是两个不同的设计模式,但是可以结合使用。下面我来简单介绍一下如何在C++中实现桥接模式和抽象工厂。 首先,我们需要定义桥接模式中的抽象类和实现类。假设我们要实现一个图形库,可以绘制不同类型的图形,包括圆形、矩形和三角形。我们可以定义一个抽象类Shape,表示图形的基本属性和方法: ```cpp class Shape { public: virtual void draw() = 0; virtual ~Shape() {} }; ``` 然后,我们定义三个实现类,分别表示圆形、矩形和三角形: ```cpp class Circle : public Shape { public: void draw() override { cout << "Draw Circle." << endl; } }; class Rectangle : public Shape { public: void draw() override { cout << "Draw Rectangle." << endl; } }; class Triangle : public Shape { public: void draw() override { cout << "Draw Triangle." << endl; } }; ``` 接下来,我们需要实现桥接模式中的桥接类,它将抽象类和实现类进行桥接。假设我们要支持不同的绘制方式,包括OpenGL和DirectX。我们可以定义一个抽象类DrawAPI,表示绘制的基本属性和方法: ```cpp class DrawAPI { public: virtual void draw() = 0; virtual ~DrawAPI() {} }; ``` 然后,我们定义两个实现类,分别表示OpenGL和DirectX的绘制方式: ```cpp class OpenGLAPI : public DrawAPI { public: void draw() override { cout << "Draw using OpenGL." << endl; } }; class DirectXAPI : public DrawAPI { public: void draw() override { cout << "Draw using DirectX." << endl; } }; ``` 最后,我们需要使用抽象工厂来创建图形和绘制方式的组合。我们可以定义一个抽象工厂类AbstractFactory,表示图形和绘制方式的组合: ```cpp class AbstractFactory { public: virtual Shape* createShape() = 0; virtual DrawAPI* createDrawAPI() = 0; virtual ~AbstractFactory() {} }; ``` 然后,我们定义两个具体的工厂类,分别表示OpenGL和DirectX的图形和绘制方式的组合: ```cpp class OpenGLFactory : public AbstractFactory { public: Shape* createShape() override { return new Circle(); } DrawAPI* createDrawAPI() override { return new OpenGLAPI(); } }; class DirectXFactory : public AbstractFactory { public: Shape* createShape() override { return new Rectangle(); } DrawAPI* createDrawAPI() override { return new DirectXAPI(); } }; ``` 最后,我们可以使用这些类来绘制图形。例如,我们可以使用OpenGL和圆形来绘制一个图形: ```cpp AbstractFactory* factory = new OpenGLFactory(); Shape* shape = factory->createShape(); DrawAPI* api = factory->createDrawAPI(); api->draw(); shape->draw(); ``` 输出结果为: ``` Draw using OpenGL. Draw Circle. ``` 这就是桥接模式和抽象工厂在C++中的实现。通过使用桥接模式和抽象工厂,我们可以将抽象类和实现类进行解耦,从而实现更加灵活和可扩展的设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值