设计模式--桥接模式

桥接模式

  定义: 将抽象部分与它的实现部分分离,使它们都可以独立地变化。

案例:

看下图手机与手机软件的类图

 

 

增加一款新的手机软件,需要在所有手机品牌类下添加对应的手机软件类,当手机软件种类较多时,将导致类的个数急剧膨胀,难以维护

手机和手机中的软件是什么关系?

手机中的软件从本质上来说并不是一种手机,手机软件运行在手机中,是一种包含与被包含关系,而不是一种父与子或者说一般与特殊的关系,通过继承手机类实现手机软件类的设计是违反一般规律的。

如果Oppo手机实现了wifi功能,继承它的Oppo应用商城也会继承wifi功能,并且Oppo手机类的任何变动,都会影响其子类

换一种解决思路

 

 

从类图上看起来更像是手机软件类图,涉及到手机本身相关的功能,比如说:wifi功能,放到哪个类中实现呢?放到OppoAppStore中实现显然是不合适的

引起整个结构变化的元素有两个,一个是手机品牌,一个是手机软件,所以我们将这两个点抽出来,分别进行封装

 

桥接模式结构及代码示例

类图:

实现:

public interface Software{

  public void run();

}

public class AppStore implements Software(

  @Override

  public void run()

  {

    System.out.println("run app store");

  }

)

public class Camera implements Software{

  @Override

  public void run ()

  {

    System.out.println("run camera");

  }

}

抽象:

public abstract class Phone{

  protected Software software;

  public void setSoftware(Software software)

   {

    this.software = software;

  }

  public abstract void run();

}

public class Oppo extends Phone{

  @Oveerride 

  public void run()

  {

    software.run();

  }

}

public class Vivo extends Phone

{

   @Override

  public void run()

  {

    software.run();

  }

}

  对比最初的设计,将抽象部分(手机)与它的实现部分(手机软件类)分离,将实现部分抽象成单独的类,使它们都可以独立地变化。整个类图看起来像一座桥,所以称为桥接模式

  继承是一种强耦合关系,子类的实现与它的父类有非常紧密的依赖关系,父类的任何变化 都会导致子类发生变化,因此继承或者说强耦合关系严重影响了类的灵活性,并最终限制了可复用性

  从桥接模式的设计上我们可以看出聚合是一种比继承要弱的关联关系,手机类和软件类都可独立的进行变化,不会互相影响

适用场景:

桥接模式通常适用于以下场景。

  1. 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。

  2. 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。

  3. 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

posted @ 2022-03-26 10:59  zwbsoft  阅读(31)  评论(0编辑  收藏  举报