桥接模式:bridge,将抽象部分与它的实现部分分离,使它们都可以独立的变化。(DP)
通俗理解:实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。
结构图:
桥接模式的使用场景
1、当一个对象有多个变化因素的时候,通过抽象这些变化因素,将依赖具体实现,修改为依赖抽象。
2、当某个变化因素在多个对象中共享时。我们可以抽象出这个变化因素,然后实现这些不同的变化因素。
3、当我们期望一个对象的多个变化因素可以动态的变化,而且不影响客户的程序的使用时。
实例一:计算机与操作系统
书上定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。下面给出这种设计的UML图,其实就是桥接模式的UML图。
1 //操作系统 2 class OS 3 { 4 public: 5 virtual void InstallOS_Imp() {} 6 }; 7 class WindowOS: public OS 8 { 9 public: 10 void InstallOS_Imp() { cout<<"安装Window操作系统"<<endl; } 11 }; 12 class LinuxOS: public OS 13 { 14 public: 15 void InstallOS_Imp() { cout<<"安装Linux操作系统"<<endl; } 16 }; 17 class UnixOS: public OS 18 { 19 public: 20 void InstallOS_Imp() { cout<<"安装Unix操作系统"<<endl; } 21 }; 22 //计算机 23 class Computer 24 { 25 public: 26 virtual void InstallOS(OS *os) {} 27 }; 28 class DellComputer: public Computer 29 { 30 public: 31 void InstallOS(OS *os) { os->InstallOS_Imp(); } 32 }; 33 class AppleComputer: public Computer 34 { 35 public: 36 void InstallOS(OS *os) { os->InstallOS_Imp(); } 37 }; 38 class HPComputer: public Computer 39 { 40 public: 41 void InstallOS(OS *os) { os->InstallOS_Imp(); } 42 };
客户使用方式:
1 int main() 2 { 3 OS *os1 = new WindowOS(); 4 OS *os2 = new LinuxOS(); 5 Computer *computer1 = new AppleComputer(); 6 computer1->InstallOS(os1); 7 computer1->InstallOS(os2); 8 }
实例二:手机品牌与手机软件
补充:
在面向对象中,合成/聚合复用原则:优先使用对象合成/聚合,而不是类继承。这样有助于你保持每个类被封装,并被剧终在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
合成(组合、Composition)和聚合(Aggregation)都是关联的特殊种类。
关联:两个类的一般性关系,例如学生和老师就是一种关联关系。
聚合:has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,使用空的菱形表示聚合关系。
组合:contains-a的关系,关联性强于聚合,组合类和被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形标识组合关系。
链接:
http://www.cnblogs.com/hegezhou_hot/archive/2010/12/10/1902185.html
http://blog.csdn.net/wuzhekai1985/article/details/6670473