此文参考《大话设计模式》
当我们设计要做一款软件,假设为QQ。要考虑两种平台,windows和linux。我们可能做出这样的继承体系。
我们可能写出这样的代码:
#include <iostream>
using namespace std;
class QQ
{
public:
virtual ~QQ(){}
virtual void show()=0;
};
class WindowsQQ:public QQ
{
public:
void show()
{
cout<<"这是windows平台QQ"<<endl;
}
};
class LinuxQQ:public QQ
{
public:
void show()
{
cout<<"这是linux平台QQ"<<endl;
}
};
int main()
{
QQ *q=new WindowsQQ;
q->show();
delete q;
q=new LinuxQQ;
q->show();
delete q;
}
但是,需求改变了,我们还要在做出一款跨平台的飞信。或许我们改变继承体系如下:
但是,如果要在增加MP3,通讯录,拍照。。。等软件,这个继承变的越来越庞大,并且充斥这严重的代码重复,每个软件都要实现两次。
这时,我们可以使用桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
代码如下:
#include <iostream>
using namespace std;
// 软件的基类
class Software
{
public:
virtual ~Software(){}
virtual void show()=0;
};
class QQ:public Software
{
public:
virtual void show()
{
cout<<"QQ软件"<<endl;
}
};
class FeiXin:public Software
{
public:
virtual void show()
{
cout<<"飞信软件"<<endl;
}
};
//操作系统的基类
class OS
{
public:
virtual ~OS(){}
virtual void show(Software *s)=0;
};
class Windows:public OS
{
public:
virtual void show(Software *s)
{
cout<<"windows平台 ";
s->show();
}
};
class Linux:public OS
{
public:
virtual void show(Software *s)
{
cout<<"linux平台 ";
s->show();
}
};
int main()
{
Software *qq=new QQ;
Software *fx=new FeiXin;
OS *win=new Windows;
OS *linux=new Linux;
win->show(qq);
linux->show(qq);
win->show(fx);
linux->show(fx);
delete qq;
delete fx;
delete win;
delete linux;
}
![](https://img-my.csdn.net/uploads/201210/21/1350794153_6736.png)