桥模式
桥模式与修饰模式都是“单一职责”模式。
桥接(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);
}