设计模式:桥模式

桥模式

桥模式与修饰模式都是“单一职责”模式。

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

主要解决的问题:

  • 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
  • 将抽象部分与实现部分分离,使他们可以独立的变化。

下面来看一个多层继承的结构:
在这里插入图片描述
这种结构存在的问题:

如果增加一个新的类都会引起另一个维度的类的变化,同时相同的抽象功能使得代码爆炸,维护起来十分困难。

我举另外一个例子:
假定有一个基类是管理者,该管理者分为电脑管理者和手机管理者两种,同时每种管理者又有两个管理人。
通过上述关系我们可以建立三层继承的结构来进行实现,总共的类有1+2+2*2 = 7个。

//管理者
class Messager
{
public:
	Messager() {};
	virtual ~Messager() {};
public:
	virtual void Login(string username, string password) = 0; //登录
	virtual void SendMessage(string message) = 0; //发消息
	virtual void SendPicture(Image image) = 0; //发图片
	//抽象实现
	virtual void PlaySound() = 0;	
	virtual void DrawShape() = 0;
	virtual void WriteText() = 0;
	virtual void Connect() = 0;
};

电脑管理者PCMessagerBase && 手机管理者 MobileMessagerBase

//平台实现
class PCMessagerBase : public Messager {
public:

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

class MobileMessagerBase : public Messager {
public:

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

每个管理平台的两个管理人:

//业务抽象
//PCMessager管理者1
class PCMessagerLite :public PCMessagerBase {
public:

	virtual void Login(string username, string password) {
		PCMessagerBase::Connect();
		//.............
	}
	virtual void SendMessage(string message) {
		PCMessagerBase::WriteText();
		//.............
	}
	virtual void SendPicture(Image image) {
		PCMessagerBase::DrawShape();
		//.............
	}
};
//PCMessager管理者2
class PCMessagerPerfect :public PCMessagerBase {
public:

	virtual void Login(string username, string password) {
		PCMessagerBase::PlaySound();
		//*************
		PCMessagerBase::Connect();
		//.............
	}
	virtual void SendMessage(string message) {
		PCMessagerBase::PlaySound();
		//*************
		PCMessagerBase::WriteText();
		//.............
	}
	virtual void SendPicture(Image image) {
		PCMessagerBase::PlaySound();
		//*************
		PCMessagerBase::DrawShape();
		//.............
	}
};

//MobileMessager管理者1
class MobileMessagerLite :public MobileMessagerBase {
public:

	virtual void Login(string username, string password) {
		MobileMessagerBase::Connect();
		//.............
	}
	virtual void SendMessage(string message) {
		MobileMessagerBase::WriteText();
		//.............
	}
	virtual void SendPicture(Image image) {
		MobileMessagerBase::DrawShape();
		//.............
	}
};
//MobileMessager管理者2
class MobileMessagerPerfect :public MobileMessagerBase {
public:

	virtual void Login(string username, string password) {
		MobileMessagerBase::PlaySound();
		//*************
		MobileMessagerBase::Connect();
		//.............
	}
	virtual void SendMessage(string message) {
		MobileMessagerBase::PlaySound();
		//*************
		MobileMessagerBase::WriteText();
		//.............
	}
	virtual void SendPicture(Image image) {
		MobileMessagerBase::PlaySound();
		//*************
		MobileMessagerBase::DrawShape();
		//.............
	}
};

这种结构的缺点很明显:

代码重复过多,不同平台的相应管理人所做的事情针对平台来说的动作是一样的,当管理人有M,平台有N个时就会出现(1+N+N*M)个类

下面我们通过桥模式来进行改进:(桥模式示意图如下)
桥模式示意图

我们需要将上述结构分为两个维度,一是管理的平台,一是管理者的种类,并且将将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联

首先我们将基类(管理者)拆分成两个维度:

class Messager
{
public:
	Messager() {};
	virtual ~Messager() {};
public:
	virtual void Login(string username, string password) = 0;
	virtual void SendMessage(string message) = 0;
	virtual void SendPicture(Image image) = 0;

public:
	MessagerImp * messagerImp; // = new PCMessagerBase()
};

//平台实现
class MessagerImp
{
public:
	MessagerImp() {};
	virtual ~MessagerImp() {};
public:

	virtual void PlaySound() = 0;
	virtual void DrawShape() = 0;
	virtual void WriteText() = 0;
	virtual void Connect() = 0;

};

使各个管理平台继承 MessagerImp

class PCMessagerBase : public MessagerImp {
public:

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

class MobileMessagerBase : public MessagerImp {
public:

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

使各个抽象的管理者来继承Messager

class MessagerLite : public Messager {
public:

	virtual void Login(string username, string password) {
		messagerImp->Connect();
		//.............
	}
	virtual void SendMessage(string message) {
		messagerImp->WriteText();
		//.............
	}
	virtual void SendPicture(Image image) {
		messagerImp->DrawShape();
		//.............
	}
};

class MessagerPerfect :public Messager {
public:

	virtual void Login(string username, string password) {
		messagerImp->PlaySound();
		//*************
		messagerImp->Connect();
		//.............
	}
	virtual void SendMessage(string message) {
		messagerImp->PlaySound();
		//*************
		messagerImp->WriteText();
		//.............
	}
	virtual void SendPicture(Image image) {
		messagerImp->PlaySound();
		//*************
		messagerImp->DrawShape();
		//.............
	}
};

通过这种设计可以减少代码的重复,满足“单一职责”模式,在新增管理者和新增管理人都十分方便。

void process() {
	//运行时装配
	MessagerImp* mImp = new PCMessagerBase();
	Messager* m = new Messager(mImp);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值