设计模式之桥接模式

桥接模式(Bridge),其含义是将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的实现指的是功能的实现,并非接口实现。当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。该模式在抽象类与它的实现之间起到了桥梁作用,使它们可以独立地变化。

其适用性:

你不希望在抽象和它的实现部分之间有一个固定的绑定关系,

类的抽象以及它的实现都应该通过生成子类的方法加以扩充。这是Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充

对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译

你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的

有许多类要生成,这种类层次结构说明你必须将一个对象分解成两个部分。Rumbaugh称这种类层次结构为”嵌套的普化“

你想在多个对象间共享实现(可能使用引用计数) ,但同时要求客户并不知道这一点。

桥接模式更多是提示我们如何组织面向对象设计的分解方式:第一要把依赖具体变成依赖抽象,第二如果同时存在多个正交的变化因素,就顺次展开,逐个抽象,第三为每个抽象因素提供具体实现。

如下:

设计模式之桥接模式

桥接模式避免了在抽象和实现之间建立静态的联系,将其解耦独立变化,如下例子对应上图的模式结构图:

      设计模式之桥接模式 

约会是抽象,其实现是活动类,活动类的具体实现是吃饭和看电影,而RefineAbstraction可以是和女生约会或者和女士约会,下面是实现:

 package org.designpattern.structural.bridge;

     public abstract class Dating {
         private Activity activity;
         public Activity getActivity() {
             return activity;
         }
        public void setActivity(Activity activity) {
             this.activity = activity;
         }
        public abstract void act(Activity activity);
    }

  Activity.java就是一个接口,package org.designpattern.structural.bridge;

    public interface Activity {
          public void doSomething();
     }

 DateWithGirl.java

package org.designpattern.structural.bridge;

      public class DateWithGirl extends Dating {
           public void act(Activity activity){
                activity.doSomething();
       }

     } 

  DateWithLady.java

package org.designpattern.structural.bridge;

       public class DateWithLady extends Dating{
          public void act(Activity activity){
             activity.doSomething();
       }

     } 

下面是两个具体的实现类;

EatMeal.java

public class EatMeal implements Activity{

      public void doSomething(){
           System.out.println("eat a meal!");
      }

    } 

  WatchMovies.java

public class WatchMovies implements Activity {

       public void doSomething(){
           System.out.println("watch movies!");
      }

     } 

  客户测试类:

public class Main {

    public static void main(String[] args){
        Dating dating = new DateWithGirl();
        dating.act(new WatchMovies());

        Dating dat1 = new DateWithLady();
        dat1.act(new EatMeal());
    }

   } 

桥接模式是一个非常有用的模式,在需求中的相互关联的抽象有多个变化维度时,需要使用桥接模式来解耦。