意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
GOF中对桥接模式的意图描述,是这样写的,在我第一次理解的过程中,对“抽象部分”、“实现部分”的理解,很不具体。
通常,我对于“抽象部分”的理解,更偏重于“接口”、“抽象类”等,“实现部分”,更偏重于“子类”、“实现类”,但如果以这种方式理解,Bridge模式就没有任何意义了。
实例
左侧Window层次,是一种对视窗系统的抽象;其中Window是接口或抽象类,IconWindow是Window的子类,是抽象的视窗系统的一部分——图标。Window汇聚了视窗系统的基本操作,比如“DrawRect()”,其子类调用父类(Window)抽象出的基本操作,实现自己的方法、功能。因此,Window类可以看做是视窗系统所有基本操作的抽象集合。
右侧是视窗系统在不同机器上的实现,准确的说不是整个视窗系统,而是视窗系统中的基本操作、功能,在不同机器上的实现。Window类中的方法在WindowImpl及其子类中都有对应的方法,所以右侧是视窗系统基本操作的实现类层次。WindowImpl是一个接口,描述视窗系统基本操作的实现。其子类描述不同机器上的具体实现。
明白了“抽象”是对视窗系统基本操作的抽象,“实现”是对视窗系统基本操作的实现;将视窗系统基本操作分离出来,那么整个视窗系统怎么演化,都还是这些基本操作,与基本操作的实现,也就是具体机器无关;同时具体使用的机器发生变化,视窗系统仍然能够使用。这就是“抽象部分”和“实现部分”分离。
类图结构
有了上面具体实例的分析,现在来看类图,就比较清楚了,个人觉得,把握住了“抽象部分”和“实现部分”是对那些部分的抽象和实现,就能明白Bridge模式了。
当然具体来说,RefinedAbstraction类中,应该使用Abstraction类中的Operation(),构建更加复杂的功能;而Abstraction类中的Operation()具体实现,由Implementor类层次实现。