21、桥接模式(Bridge Pattern)

2020-08-29  本文已影响0人  火山_6c7b

1. 桥接模式

1.1 简介

  Bridge 模式将抽象和行为划分开,各自可以独立地变化,但又能动态的结合。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

  将抽象部分与它的实现部分分离,使他们都可以独立地变化。“将抽象部分与它的实现部分分离”指实现系统可能有多个角度分类,每一种分类都可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

1.2 诞生背景

  如果有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:

图形继承实现.png

  我们发现继承会衍生出很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。

  试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。

1.3 桥接模式结构

桥接模式uml:

桥接模式uml.png

桥接模式角色:

2. 示例

  使用桥接模式时,我们把抽象共同部分和行为共同部分各自独立开来,原来是准备放在一个接口里,现在需要设计两个接口:抽象接口和行为接口,分别放置抽象和行为。

  以一杯咖啡为例,子类实现类为四个:中杯加奶、大杯加奶、 中杯不加奶、大杯不加奶。上面四个子类中有概念重叠,可从另外一个角度进行考虑,这四个类实际是两个角色的组合:抽象 和行为,其中抽象为:中杯和大杯;行为为:加奶 不加奶(如加橙汁 加苹果汁)。

  实现四个子类在抽象和行为之间发生了固定的绑定关系,如果以后动态增加加葡萄汁的行为,就必须再增加两个类:中杯加葡萄汁和大杯加葡萄汁。显然混乱,扩展性极差。那我们从分离抽象和行为的角度,使用Bridge模式来实现。

行为部分:
是否加奶或其他配料的行为接口,CoffeeImp:

public interface CoffeeImp
{
   public void pourCoffeeImp();
}

加奶MilkCoffeeImp:

public class MilkCoffeeImp implements CoffeeImp
{
   public void pourCoffeeImp()
   {
     System.out.println("加了美味的牛奶");
   }
}

不加奶FragrantCoffeeImp:

public class FragrantCoffeeImp implements CoffeeImp
{
   public void pourCoffeeImp()
   {
     System.out.println("什么也没加,清香");
   }
}

对象抽象部分:
咖啡大小杯型号抽象Coffee:

public abstract class Coffee
{
   CoffeeImp coffeeImp;
   public void setCoffeeImp(CoffeeImp coffeeImp) {
     this.CoffeeImp = coffeeImp;
   }

  public CoffeeImp getCoffeeImp() {return this.CoffeeImp;}
   public abstract void pourCoffee();
}

中杯咖啡MediumCoffee:

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();
    }  
   }
}

大杯咖啡SuperSizeCoffee:

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();
    }  
   }
}

调用示例:

    public static void main(String[] args) {  
        // 大杯加奶咖啡
        CoffeeImp milk = new MilkCoffeeImp();
        Coffee superSizeCoffee = new SuperSizeCoffee(milk);
        superSizeCoffee.pourCoffee;
    } 

3. 总结

  桥接模式是设计Java虚拟机和实现JDBC等驱动程序的核心模式之一,应用较为广泛。在软件开发中如果一个类或一个系统有多个变化维度时,都可以尝试使用桥接模式对其进行设计。桥接模式为多维度变化的系统提供了一套完整的解决方案,并且降低了系统的复杂度。

桥接模式优点:

桥接模式缺点:

桥接模式适用场景:

上一篇下一篇

猜你喜欢

热点阅读