结构型模式Structural Patterns之桥接模式bridge

@著作权归作者所有:来自CSDN博客作者大胡子的艾娃的原创作品,如需转载,请注明出处https://blog.csdn.net/qq_43148810,否则将追究法律责任。
如有错误的地方欢迎指正,谢谢!

一、Messager 类设计的场景:
1、由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度, 乃至多个纬度的变化。
2、利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度。
例如:Messager 类的方法有平台实现{PlaySound,DrawShape,WriteText,Connect}和业务抽象{Login,SendMessage,SendPicture}

实现思路:将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。
实现技术1:多继承方案,抽象部分(业务功能)为一个基类,实现部分(平台实现)为一个基类,不推荐,违背单一职责原则,复用性差。
实现技术2:单继承一个的维度变化,其他维度的变化各自打包成一个基类,推荐使用。
备注:理解C++的继承关系

#pragma once
#include<string>
struct Image
{
	Image()
	{
		date = new int[800*600];
	}
	~Image()
	{
		delete date;
	}
	int *date;
	int height;
	int width;
	int type;
};

class MessagerImp {
public:
	virtual void PlaySound() = 0;
	virtual void DrawShape() = 0;
	virtual void WriteText() = 0;
	virtual void Connect() = 0;
};

//平台实现 n
class PCMessagerImp : public MessagerImp {
public:

	virtual void PlaySound() {
		//**********
	}
	virtual void DrawShape() {
		//**********
	}
	virtual void WriteText() {
		//**********
	}
	virtual void Connect() {
		//**********
	}
};

class MobileMessagerImp : public MessagerImp {
public:

	virtual void PlaySound() {
		//==========
	}
	virtual void DrawShape() {
		//==========
	}
	virtual void WriteText() {
		//==========
	}
	virtual void Connect() {
		//==========
	}
};


class Messager {
private:
	//**MessagerImp为变化的一个维度,打包成虚基类,该类指针成为一个成员对象,多维的话,再多几个这样的成员对象**
	MessagerImp* messagerImp;//...
public:
	virtual void Login(std::string username, std::string password) const = 0;
	virtual void SendMessage(std::string message) const = 0;
	virtual void SendPicture(Image image) const = 0;

	MessagerImp* getMessagerImp() const {
		return messagerImp;
	}
	Messager(MessagerImp* messagerImp) {
		this->messagerImp = messagerImp;
	}
	virtual ~Messager() {
	}
};

//业务抽象 m
//MessagerLite,MessagerPerfect根据不同需求的业务实现
//类的数目:1+n+m
class MessagerLite :public Messager {
public:

	virtual void Login(std::string username, std::string password) const override {

		getMessagerImp()->Connect();
		//........
	}
	virtual void SendMessage(std::string message)  const override {

		getMessagerImp()->WriteText();
		//........
	}
	virtual void SendPicture(Image image)  const override {

		getMessagerImp()->DrawShape();
		//........
	}

	MessagerLite(MessagerImp* messagerImp)
		:Messager(messagerImp){
	}
};


class MessagerPerfect :public Messager {
public:
	virtual void Login(std::string username, std::string password) const override {

		getMessagerImp()->PlaySound();
		//********
		getMessagerImp()->Connect();
		//........
	}
	virtual void SendMessage(std::string message) const override {

		getMessagerImp()->PlaySound();
		//********
		getMessagerImp()->WriteText();
		//........
	}
	virtual void SendPicture(Image image) const override {

		getMessagerImp()->PlaySound();
		//********
		getMessagerImp()->DrawShape();
		//........
	}

	MessagerPerfect(MessagerImp* messagerImp)
		:Messager(messagerImp){
	}
};

二、具体调用

#include"Bridge.h"
int main()
{
	//运行时装配
	MessagerImp* mImp = new PCMessagerImp();	//或new MobileMessagerImp();
	Messager *mLite = new MessagerLite(mImp);
	Messager *mPerfect = new MessagerPerfect(mImp);

	mLite->Login(s, s);
	mLite->getMessagerImp()->Connect();
	mLite->getMessagerImp()->WriteText();
	
	delete mLite;
	delete mPerfect;
	delete mImp;
}

三:总结
1、Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。
2、Bridge模式有时候类似于多继承方案,但是多继承方案往往违背 单一职责原则(即一个类只有一个变化的原因),复用性比较差。 Bridge模式是比多继承方案更好的解决方法。
3、Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。

更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章