设计模式之桥接模式
【定义】桥接模式(Bridge),将抽象部分与它的实现部分分离,使他们都可以独立地变化。
![]()
   
【场景】继承实际上是一种非常紧密的依赖关系,也即父类实现中的任何变化都将会导致子类发生变化。以手机为例,手机包括品牌和操作系统,假设现在手机品牌分三种:三星,苹果,诺基亚,而手机软件按系统来分也有两种:安卓,IOS。假设一个品牌和一个系统就可以组成一个手机。
首先,手机肯定是一个抽象的对象,按品牌来分可以有三星手机,苹果手机,诺基亚手机,这三种手机是手机抽象对象的三个具体实现,看下面的UML图。实际上操作系统也应该是一个抽象对象,也就应该有一个OperateSystem的对象,而Android和IOS都是从OperateSystem继承过来的具体实现。但下面(UML中)的Android和IOS的父类却是品牌的一个具体实现(父类是Iphone或其它2个),即操作系统的实现是基于品牌的实现的。这样有什么弊端呢?如果现在需要增加一个Symbian的系统,需要做哪些重复的改动?这就是让一个实现基于另外一个实现的局限性。像这种情况最好不要使用类继承,而是使用合成/聚合复用原则。

【UML】更好的设计应该是像下图这样,这样如果需要添加一个Symbian系统只需新增OperateSystem的一个新实现即可。

【代码】
#include <iostream>
using namespace std;
class OperateSystem
{
public:
	virtual void display() = 0;
};
class Ios : public OperateSystem
{
public:
	void display()
	{
		cout<<"IOS"<<endl;
	}
};
class Android : public OperateSystem
{
public:
	void display()
	{
		cout<<"Android"<<endl;
	}
};
class Phone
{
protected:
	OperateSystem* operateSystem;
public:
	virtual void display() = 0;
	void set_os(OperateSystem* os)
	{
		operateSystem = os;
	}
};
class Iphone : public Phone
{
public:
	void display()
	{
		cout<<"Iphone:\t";
		operateSystem->display();
	}
};
class Nokia : public Phone
{
public:
	void display()
	{
		cout<<"Nokia:\t";
		operateSystem->display();
	}
};
class Sumsung : public Phone
{
public:
	void display()
	{
		cout<<"Sumsung: ";
		operateSystem->display();
	}
};
int main()
{
	Phone* p1 = new Iphone;
	Phone* p2 = new Nokia;
	OperateSystem* os1 = new Ios;
	OperateSystem* os2 = new Android;
	p1->set_os(os1);
	p2->set_os(os2);
	p1->display();
	p2->display();
	delete p1;
	delete p2;
	delete os1;
	delete os2;
	return 0;
}【运行结果】
    不积跬步无以至千里,不积小流无以成江河。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号