Linux C++ 061-设计模式之桥接模式
本节关键字:Linux、C++、设计模式、桥接模式
相关库函数:
概念
桥接模式是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式,是将抽象部分与它的实现部分分离,使它们都可以独立地变化。
意图
桥接模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
抽象化
存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。
实现化
抽象化给出的具体实现,就是实现化。
脱耦
所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。
将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。
角色说明
桥梁模式所涉及的角色有:抽象化角色、修正抽象化角色、实现化角色、具体实现化角色。
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
代码示例
// 将抽象部门与实现部分相分离,使他们独立变化。
// 桥接模式的适用情况:
// 当一个对象有多个变化因素的时候,考虑依赖于抽象的实现而不是具体的实现
// 当多个变化因素在多个对象间共享的时候,可以考虑将变化因素抽象出来再聚合进去
// 当一个对象的多个变化因素可以动态变化的时候
// 优点:
// 将实现抽象出来,在实现抽象,使得对象的实现依赖于抽象,满足依赖倒转原则
// 更好的可扩展性
// 可动态的切换实现,桥接模式将抽象和实现分离出来,在实现桥接模式时,可以动态的选择具体的实现
//
// 手机软件
class HandsetSoft
{
public:
virtual void run() = 0;
};
class HandsetGame : public HandsetSoft
{
public:
void run() {
cout << "run mobile game" << endl;
}
};
class HandsetAddressList : public HandsetSoft
{
public:
void run() {
cout << "run addree list" << endl;
}
};
// 手机品牌
class HandsetBrand
{
protected:
HandsetSoft* soft;
public:
HandsetBrand() {
soft = NULL;
}
void setHandsetSoft(HandsetSoft* soft) {
this->soft = soft;
}
virtual void run() = 0;
};
class HandsetBrandN :public HandsetBrand
{
public:
void run() {
soft->run();
}
};
class HandsetBrandM :public HandsetBrand
{
public:
void run() {
soft->run();
}
};
int main_Brige()
{
HandsetBrand* hb;
hb = new HandsetBrandM();
hb->setHandsetSoft(new HandsetGame());
hb->run();
hb->setHandsetSoft(new HandsetAddressList());
hb->run();
return 0;
}
// 具体的手机品牌类和手机软件类都是在各自的抽象基类的基础上派生出来的
// 不同的手机品牌中,都会安装手机软件,在不同的手机品牌类的实现中,只需调用手机软件的抽象基类即可
// 客户端:实例化相应品牌的手机,手机根据自己的需要安装不同的手机软件