桥接模式

Posted _Doing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桥接模式相关的知识,希望对你有一定的参考价值。

 
  • 何时使用系统可能有多个角度分类,每一种角度都可能变化在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
  • 如何解决需要一个作为桥接的接口/抽象类,多个角度的实现类依赖注入到抽象类,使它们在抽象层建立一个关联关系,能把这种多角度分类的实现类分离出来,让它们独立变化,减少它们之间耦合;同时,抽象和实现之间可以独立扩展,不会影响到彼此,也将实现部分与抽象部分分离,使它们都可以独立的变化。
  • 优点: 1、抽象和实现的分离。 2、优秀的扩展能力。如果你采用了bridge模式,在处理新的实现将会非常容易。你只需定义一个新的具体实现类,并且实现它就好了,不需要修改任何其他的东西。但是如果你出现了一个新的具体情况,需要对实现进行修改时,就得先修改抽象的接口,再对其派生类进行修改,但是这种修改只会存在于局部,并且这种修改将变化的范围控制在局部,并且降低了出现副作用的风险,而且类之间的关系十分清晰,实现一目了然。 3、实现细节对客户透明。
  • 缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。4、需要跨越多个平台的图形和窗口系统上
  • 注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
 
框架
 
四个角色:
  • Abstraction:抽象部分。该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类;
  • RefinedAbstraction:优化的抽象部分。抽象部分的具体实现,该类一般对抽象部分的方法进行完善和扩展;
  • Implementor:实现部分。’可以为接口或者是抽象类,其方法不一定要与抽象部分中的一致,一般情况下是由实现部分提供基本的操作,而抽象部分定义的则是基于实现部分基本操作的业务方法;
  • ConcreteImplementorA 和 ConcreteImplementorB :实现部分的具体实现。完善实现部分中定义的具体逻辑。
Implementor.class
  1. public interface Implementor{
  2.     void operationImpl();
  3. }
ConcreteImplementorA.class
  1. publicclassConcreteImplementorA implements Implementor{
  2.     @Override
  3.     publicvoid operationImpl(){
  4.         //具体实现
  5.     }
  6. }
ConcreteImplementorB.class
  1. publicclassConcreteImplementorB implements Implementor{
  2.     @Override
  3.     publicvoid operationImpl(){
  4.         //具体实现
  5.     }
  6. }
然后是抽象部分的代码:
Abstraction.class
  1. public abstract classAbstraction{
  2.     privateImplementor implementor;
  3.  
  4.     publicAbstraction(Implementor implementor){
  5.         this.implementor = implementor;
  6.     }
  7.  
  8.     publicvoid operation(){
  9.         implementor.operationImpl();
  10.     }
  11. }
RefinedAbstraction.class
  1. publicclassRefinedAbstraction extends Abstraction{
  2.     publicRefinedAbstraction(Implementor implementor){
  3.         super(implementor);
  4.     }
  5.  
  6.     publicvoid refinedOperation(){
  7.         //对 Abstraction 中的 operation 方法进行扩展
  8.     }
  9. }
(RefinedAbstraction 类根据实际情况是可以有多个的)
 
android的ListAdapter
        容器的形状(或理解为展现的方式)以及怎么样来绘制容器内的视图,可以独自的变化,双双不会干扰,真正的脱耦:“将抽象部分与实现部分分离,使它们都可以独立的变化。”
 
 
Android - Window 与 WindowManager 之间的桥接模式
        Window 类和 PhoneWindow 类为抽象部分,PhoneWindow 为 Window 类的唯一实现子类,在 Window 类中,持有了一个 WindowManager 类的引用,并且在 setWindowManager 方法中将其赋值为了 WindowManagerImpl 对象,对应着的WindowManager 接口和 WindowManagerImpl 类就组成了实现部分,所以说这四个类使用的就是典型的桥接模式,Window 中的 addView,removeView 等操作都桥接给了 WindowManagerImpl 去处理。
来源:java/android 设计模式学习笔记(8)---桥接模式:http://blog.csdn.net/self_study/article/details/51622243
 
一个典型例子:学习:java设计模式—Bridge模式http://www.cnblogs.com/forlina/archive/2011/06/22/2087350.html
 
 
 
 





以上是关于桥接模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式(十五)——桥接模式

结构型设计模式 之 桥接模式

桥接模式

设计模式学习笔记-桥接模式

桥接模式

桥接模式