Skip to content

桥接模式

一、介绍

桥接模式和适配器模式类似,包括以后经常会遇到意思接近一样的设计模式,因为大神往往就是多个模式混用,且根据不同的场景进行搭配,桥接设计模式也是结构型模式,将抽象部分实现部分分离,使它们都可以独立的变化。通俗来说,是通过组合来桥接其它的行为/维度

二、场景

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

三、优缺点

  • 优点
    • 抽象和实现的分离。
    • 优秀的扩展能力,符合开闭原则
  • 缺点
    • 增加系统的理解与设计难度
    • 使用聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,比如抽象类汽车,里面聚合了颜色类,有点像对象适配器

四、对比

桥接模式和适配器模式对比

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

五、代码

抽象产品类,手机phone

package com.lcy.study.design.bridge;

import com.lcy.study.design.factory.Color;
import lombok.Getter;
import lombok.Setter;

/**
 * @Description 抽象产品类
 * @Author lcy
 * @Date 2021/7/21 11:37
 */
public abstract class Phone {

    @Getter
    @Setter
    protected Color color;

    /**
     * 运行
     * @author lcy
     * @date 2021/7/21 11:39
     **/
    public abstract void run();

    /**
     * 充电
     * @author lcy
     * @date 2021/7/21 11:39
     **/
    public abstract void recharge();

}

配件接口Color

package com.lcy.study.design.factory;

/**
 * @Description 汽车颜色
 * @Author lcy
 * @Date 2021/7/20 12:00
 */
public interface Color {

    /**
     * 获取汽车颜色
     * @return java.lang.String
     * @author lcy
     * @date 2021/7/20 12:01
     **/
    String getColor();

}

具体配件类RedColor

package com.lcy.study.design.factory;

/**
 * @Description 红色
 * @Author lcy
 * @Date 2021/7/20 12:01
 */
public class RedColor implements Color{

    @Override public String getColor(){
        return "red";
    }
}

具体产品类iphone

package com.lcy.study.design.bridge;

import com.lcy.study.design.factory.Color;
import com.lcy.study.design.factory.RedColor;

/**
 * @Description 苹果手机
 * @Author lcy
 * @Date 2021/7/21 11:41
 */
public class Iphone extends Phone {

    public Iphone(Color color){
        this.color = color;
    }

    @Override public void run(){
        System.out.println("苹果手机正在运行");
    }

    @Override public void recharge(){
        System.out.println("苹果手机正在充电");
    }

    @Override public String toString(){
        return String.format("this is %s iphone",color.getColor());
    }

    public static void main(String[] args){
        Phone phone = new Iphone(new RedColor());
        System.out.println(phone);
    }
}