简介

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。

使用场景

我们大家都熟悉,顾名思义就是用来将河的两岸联系起来的。而此处的桥是用来将两个独立的结构联系起来,而这两个被联系起来的结构可以独立的变化,所有其他的理解只要建立在这个层面上就会比较容易。

下面是一些官方的说明,比较晦涩,必须等你有一定的经验后才能理解: 1. 如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。

  1. “抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
  2. 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
  3. 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
代码实现

我们都知道现在市场上有很多不同品牌的手机以及款式,我们该如何设计呢?

如果我们将手机作为一个抽象类,不同的款式作为它的子类,而不同款式的手机又分很多牌子,这样如果新增一个款式或者手机牌子是不是要加一整套代码。。。

如果我们这时候使用桥接模式,我们可以将手机牌子和款式分开,再用一个桥接类将这两个关联起来。之后如果新增一个手机牌子,我们是不是实现手机牌子的接口就好了。。。如果我们之后新增一个款式我们只用继承款式类就可以了。

桥接模式设计难度(设计模式之桥接模式)(1)

手机牌子接口

package bridge; /** * 手机品牌 * @author zyp * @create 2022/4/25 */ public interface PhoneBrand { /** * 手机开机 */ void open(); /** * 打电话 */ void call(); /** * 手机关机 */ void close(); }

手机牌子的实现类

package bridge; /** * 华为手机 * @author zyp * @create 2022/4/25 */ public class HuaWeiPhone implements PhoneBrand{ public void open() { System.out.println("华为手机开机"); } public void call() { System.out.println("华为手机打电话"); } public void close() { System.out.println("华为手机关机"); } }

package bridge; /** * 苹果手机 * @author zyp * @create 2022/4/25 */ public class ApplePhone implements PhoneBrand{ public void open() { System.out.println("苹果手机开机"); } public void call() { System.out.println("苹果手机打电话"); } public void close() { System.out.println("苹果手机打关机"); } }

桥接类

package bridge; /** * 桥接类 * @author zyp * @create 2022/4/25 */ public abstract class PhoneBridage { private PhoneBrand phoneBrand; public PhoneBridage(PhoneBrand phoneBrand){ this.phoneBrand = phoneBrand; } protected void open(){ phoneBrand.open(); } protected void call(){ phoneBrand.call(); } protected void close(){ phoneBrand.close(); } }

具体的款式类

package bridge; /** * 翻盖型手机 * @author zyp * @create 2022/4/25 */ public class FlipPhone extends PhoneBridage{ public FlipPhone(PhoneBrand phoneBrand){ super(phoneBrand); } @Override protected void open() { super.open(); System.out.println("翻盖型手机"); } @Override protected void call() { super.call(); System.out.println("翻盖型手机"); } @Override protected void close() { super.close(); System.out.println("翻盖型手机"); } }

测试类

package bridge; /** * @author zyp * @create 2022/4/25 */ public class BirdgeTest { public static void main(String[] args){ PhoneBridage phoneBridage = new FlipPhone(new HuaWeiPhone()); phoneBridage.open(); phoneBridage.call(); phoneBridage.close(); } }

桥接模式的优缺点

优点:

缺点:

,