我看了半天的教程,怎么也没法理解bridge模式和adapter模式有啥区别,就拿网上教材比较流行的一个例子来说,一杯咖啡为例,有中杯和大杯之分,同时还有加奶 不加奶之分.
网上的设计方法是先抽象一个Coffee的抽象类
public abstract class Coffee
{
  CoffeeImp coffeeImp;  public void setCoffeeImp() {
    this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();
  }  public CoffeeImp getCoffeeImp() {return this.CoffeeImp;}  public abstract void pourCoffee();
}其中CoffeeImp 是加不加奶的行为接口
public abstract class CoffeeImp
{
  public abstract void pourCoffeeImp();
}接下来继承Cofee类实现一个中杯,一个大杯的class
//中杯
public class MediumCoffee extends Coffee
{
  public MediumCoffee() {setCoffeeImp();}  public void pourCoffee()
  {
    CoffeeImp coffeeImp = this.getCoffeeImp();
    //我们以重复次数来说明是冲中杯还是大杯 ,重复2次是中杯
    for (int i = 0; i < 2; i++)
    {      coffeeImp.pourCoffeeImp();
    }
  
  }
}//大杯
public class SuperSizeCoffee extends Coffee
{
  public SuperSizeCoffee() {setCoffeeImp();}  public void pourCoffee()
  {
    CoffeeImp coffeeImp = this.getCoffeeImp();
    //我们以重复次数来说明是冲中杯还是大杯 ,重复5次是大杯
    for (int i = 0; i < 5; i++)
    {      coffeeImp.pourCoffeeImp();
    }
  
  }
}实现CofeeImp的两个class
//加奶
public class MilkCoffeeImp extends CoffeeImp
{
  MilkCoffeeImp() {}  public void pourCoffeeImp()
  {
    System.out.println("加了美味的牛奶");
  }
}//不加奶
public class FragrantCoffeeImp extends CoffeeImp
{
  FragrantCoffeeImp() {}  public void pourCoffeeImp()
  {
    System.out.println("什么也没加,清香");
  }
}再设计一个单态类(Singleton)用来hold当前的CoffeeImp
public class CoffeeImpSingleton
{
  private static CoffeeImp coffeeImp;  public CoffeeImpSingleton(CoffeeImp coffeeImpIn)
   {this.coffeeImp = coffeeImpIn;}  public static CoffeeImp getTheCoffeeImp()
  {
    return coffeeImp;
  }
}使用时:
//拿出牛奶
CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());//中杯加奶
MediumCoffee mediumCoffee = new MediumCoffee();
mediumCoffee.pourCoffee();//大杯加奶
SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();
superSizeCoffee.pourCoffee();我现在看到具体的实现类MediumCoffee,SuperSizeCoffee继承了抽象类Coffee,Coffee中又持有了CoffeeImp抽象类,可以根据不同的需要在具体coffee实现类构造时set进具体的CoffeeImp实现,那么整个思想不就是一个Adapter么?为什么又要来个Bridge模式呢?这两个模式到底啥区别?
 

解决方案 »

  1.   

    bridge是好几年用不到一次的模式,还是看一点常用的模式吧,等常用的模式理解的很好了,这些不常用的模式也就能理解了
    我们常说,要优先使用类组合而不是类继承,但是这个组合说起来荣日,实质上怎么做?bridge做的就是如何实现类组合。你看看自己提供的例子,是不是一个类组合的实例?
    adapter顾名思义,一个类提供了名字叫method1的方法,但是主程序的架构上只能用实现了某接口或者某个类的子类的方法,其方法名叫method2,这是就可以用一个这个模式把method1委托给你的adapter的method2方法