桥模式也是单一职责模式的一种,设计的初衷是为了避免子类急剧膨胀,充斥重复代码.
动机
由于某些类型固有的实现逻辑,使得他们具有两个甚至多个变化的维度,如何应对这种多个维度的变化,如何利用面向对象的技术可以使得类型轻松地沿着两个甚至多个方向的变化,而不引入额外的复杂度.
实例
考虑一个messager通信模块类设计,首先定义一个基类,包含登录,发送消息,发送图片,发出声音,画图,写文件,连接等操作.
class Messager{
public:
virtual void Login(const string& user_name,const string& password)=0;
virtual void SendMessage(const string& message)=0;
virtual void SendPicture(const Image& image)=0;
virtual void PlaySound()=0;
virtual void DrawShape()=0;
virtual void WriteText()=0;
virtual void Connect()=0;
virtual ~Messager(){
}
};
Messager可以在PC上实现,也可以在移动平台上实现,可以定义两个类,表示在不同的平台上的实现 .其中PlaySound,DrawShape,WriteText,Connet 的实现方式是不同的,需要在子类中进行 override.
//平台实现
class PCMessagerBase:public Messager{
public:
virtual void PlaySound(){
//****pc
}
virtual void DrawShape(){
//***pc
}
virtual void WriteText(){
//****pc
}
virtual void Connect(){
//******pc
}
};
//平台实现
class MobileMessagerBase:public Messager{
public:
virtual void PlaySound(){
//======mobile
}
virtual void DrawShape(){
//======mobile
}
virtual void WriteText(){
//======mobile
}
virtual void Connect(){
//======mobile
}
};
然后在不同的平台上,我们需要支持不同的功能,比方说,我们需要推出一个精简版,一个完美版,如果采用继承的方式,还会定义四个类,表示pc上的精简版,完美版,移动平台上的精简版,完美版,
class PCMessagerLite:public PCMessagerBase{
public:
virtual void