//桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在
两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,
让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度
设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似
一条连接两个独立继承结构的桥,故名桥接模式。
// 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了
传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,
并易于扩展,同时有效控制了系统中类的个数。
//桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
// 在使用桥接模式时,我们首先应该识别出一个类所具有的两个独立变化的维度
,将它们设计为两个独立的继承等级结构,为两个维度都提供抽象层,并建立抽象耦合。
通常情况下,我们将具有两个独立变化维度的类的一些普通业务方法和与之关系最密切的维度
设计为“抽象类”层次结构(抽象部分),而将另一个维度设计为“实现类”层次结构(实现部分)。
例如:对于毛笔而言,由于型号是其固有的维度,因此可以设计一个抽象的毛笔类,
在该类中声明并部分实现毛笔的业务方法,而将各种型号的毛笔作为其子类;
颜色是毛笔的另一个维度,由于它与毛笔之间存在一种“设置”的关系,因此我们可以
提供一个抽象的颜色接口,而将具体的颜色作为实现该接口的子类。在此,型号可认为是
毛笔的抽象部分,而颜色是毛笔的实现部分
#include <iostream>
#include <string>
using namespace std;
//手机品牌:M手机,N手机
//软件:游戏软件,通讯录
//手机软件安装在手机中
//软件虚基类
class Soft{
public:
virtual void run()=0;
};
class GameSoft:public Soft{
public:
void run(){
cout<<"GameSoft"<<endl;
}
};
class AddressListSoft:public Soft{
public:
void run(){
cout<<"AddressListSoft"<<endl;
}
};
//手机虚基类
class Phone{
public:
virtual void run(){
m_soft->run();
}
virtual void setSoft(Soft*s){this->m_soft=s;}
void getBrand(){cout<<m_brand<<endl;}
string m_brand;
private:
Soft *m_soft;
};
class PhoneA:public Phone{
public:
PhoneA(){m_brand="PhoneA";}
};
class PhoneB:public Phone{
public:
PhoneB(){m_brand="PhoneB";}
};
int main()
{
GameSoft *gs=new GameSoft;
PhoneA *pa=new PhoneA;
pa->setSoft(gs);
pa->getBrand();
pa->run();
AddressListSoft *as=new AddressListSoft;
PhoneB *pb=new PhoneB;
pb->setSoft(as);
pb->getBrand();
pb->run();
return 0;
}