桥接设计模式

2021-01-30 设计模式架构设计

可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。将抽象部分与实现部分分离,使它们都可以独立的变化。通俗来说,是通过组合来桥接其它的行为/维度。

# 应用场景

  • 系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性
  • 不想使用继承导致系统类的个数急剧增加的系统
  • 有时候一个类,可能会拥有多个变化维度,比如啤酒,有不同的容量和品牌,可以使用继承组合的方式进行开发,假如维度很多,就容易出现类的膨胀,使用桥接模式就可以解决这个问题,且解耦

# 业务重现

  • 我们需要构建一个手机类,我们知道手机有很多品牌,苹果、华为等,从另外一个颜色维度,又有多种颜色,红、黄、蓝等,

  • 那如果描述这些类的话,传统方式就直接通过继承,就需要特别多的类,品牌2,颜色3,就是6个类了,如果后续再增加品牌就更多了,类数目将会激增,即所谓的类爆炸

  • 使用桥接模式就可以解决这个问题,且灵活度大大提高

传统的继承方式实现:

桥接模式——传统的继承模式

桥接模式:

桥接模式——桥接

# 代码实战

新建一个颜色接口

public interface Color {

    void userColor();
}

颜色接口的实现类

public class BlueColor implements Color{
    @Override
    public void userColor() {
        System.out.print("蓝色的");
    }
}

public class RedColor implements Color{
    @Override
    public void userColor() {
        System.out.print("红色的");
    }
}

public class GreenColor implements Color{
    @Override
    public void userColor() {
        System.out.print("绿色的");
    }
}

创建一个抽象手机类

public abstract class Phone {

    /**
     * 通过组合的方式,桥接其他行为
     */
    protected Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    /**
     * 手机的方法——运行
     */
    abstract public void run();

}

手机的实例化

// 实例化一个苹果手机
public class ApplePhone extends Phone{

    public ApplePhone(Color color){
        super.setColor(color);
    }

    @Override
    public void run() {
        color.userColor();
        System.out.println("苹果手机");
    }
}


// 实例化一个华为手机
public class HWPhone extends Phone{

    public HWPhone(Color color){
        super.setColor(color);
    }

    @Override
    public void run() {
        color.userColor();
        System.out.println("HUAWEI手机");
    }
}

使用:

public static void main(String[] args) {
    //构建一个蓝色的华为手机
    Phone blueHWPhone = new HWPhone(new BlueColor());
    blueHWPhone.run();
    // 构建一个红色的苹果手机
    Phone redApplePhone = new ApplePhone(new RedColor());
    redApplePhone.run();
    // 构建一个绿色的华为手机
    Phone greenHWPhone = new HWPhone(new GreenColor());
    greenHWPhone.run();
}

控制台:

蓝色的HUAWEI手机
红色的苹果手机
绿色的HUAWEI手机

核心:让我的抽象类持有一个你的属性接口,如颜色接口,然后桥接过去。

代码:https://xk857.com/creational/bridge.zip

优点:抽象和实现的分离。,优秀的扩展能力,符合开闭原则

缺点:增加系统的理解与设计难度,使用聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,比如抽象类汽车,里面聚合了颜色类,有点像对象适配器

# 总结和对比

  • 按GOF的说法,桥接模式和适配器模式用于设计的不同阶段,

    • 桥接模式用于设计的前期,精细化的设计,让系统更加灵活
    • 适配器模式用于设计完成之后,发现类、接口之间无法一起工作,需要进行填坑
  • 适配器模式经常用在第三方API协同工作的场合,在功能集成需求越来越多的今天,这种模式的使用频度越来越高,包括外观设计模式 ,这个也是某些场景和适配器模式一样

上次更新: 5 个月前