桥模式(Bridge Pattern)
单一职责模式:在软件组件设计中,如果责任划分的不清晰,使用继承得到的
结果往往随着需求的变化, 子类急剧膨胀,同时充斥着重复代码,这时候关键是划分责任
意图
使抽象层与实现层分离,以便两者可以只有变化
应用场景:
1. 解耦合抽象和实现
2. 抽象和实现需要分别只有扩展
影响:
- 增加了类的数量
参与者:
Abstraction, RefinedAbstraction, Implementor, ConcreteImplementor
其中Abstraction和Implementor两个维度的变化 ,使用组合的方式添加在一起(不使用继承),
说的比较抽象,下面举例:
例:
Messager可以在处理文本、可以播放音乐、画画等等。有两个维度的变化
1. 目前有两个平台:PC版本、Mobile版本 (以后还可能增加平台)
2.目前每一个平台两个风格:Perfect风格、Lite风格 (以后还可能增加新的风格)
其中Abstraction类
class Messager{ //abstration
public:
virtual void login(string username, string password = 0) = 0;
virtual void sendMessage(string message) = 0;
virtual void sendPicture(Image image) = 0;
protected:
MessageImplement* messagImp;
};
Implementor类:
class MessageImplement{
public:
virtual void playSound() = 0;
virtual void drawShape() = 0;
virtual void writeText() = 0;
virtual void connect() = 0;
};
其中Implementor 可以在 PC 和 Mobile 两个平台
class PCMessageImplement : public MessageImplement {
public:
virtual void playSound() {};
virtual void drawShape() {};
virtual void writeText() {};
virtual void connect() {};
};
class MobileMessageImplement : public MessageImp {
public:
virtual void playSound() {};
virtual void drawShape() {};
virtual void writeText() {};
virtual void connect() {};
};
Messager有两种风格
class MessageLite :public Messager { //实现登陆等等
public:
MessageLite(MessageImplement* m) { messagImp = m ;}
virtual void login(string username, string password = 0) {
messagerImp->Connect();
};
virtual void sendMessage(string message) {
messagerImp->writeText();
};
virtual void sendPicture(Image image) {};
};
class MessagePerfect :public Messager { //实现登陆等等
public:
//实现不同模式的,pcMessageLite和mobileMessageLite
//MessageImp* messagImp; //此处提到父类中去
MessageLite(MessageImp* m) { messagImp = m ;}
virtual void login(string username, string password = 0) {};
virtual void sendMessage(string message) {};
virtual void sendPicture(Image image) {};
};
总结:
-
Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现
可以沿着各自的维度来变化。所谓抽象和实现沿着各自维度的变化,即“子类化”它们 -
Bridge模式有时候类似于多继承方案,但是多继承方案往往违背“单一职责”原则(即一个类只有
一个变化的原因),复用性比较差。Bridge模式是比多继承更好的解决方法。 -
Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个变化维度,这时可
以使用Bridge的拓展模式