JAVA结构性模式 -- 一篇文章搞懂桥接模式

一、引言

     时间过得真快呀,马上又该睡觉了 ~

二、 什么是桥接模式 ?

         桥接模式是将抽象部分与它实现的部分分离,使它们都可以独立地变化。它是一种对象结构性模式,又称为 "接口模式"。

三、传统方式

传统方式的解决办法:

    1.先定义电脑的属性、功能抽象出来

    2.由不同的款式来实现或者来继承电脑的抽象类

    3.最后由不同的品牌来制造出来

 

出现的问题:

问题一:扩展性问题,如果电脑再出来一个款式,那每个品牌都会增加一个类 (类的数量太多) 。

问题二:违反了单一指责原则,当我们增加电脑品牌时,所有款式的电脑都要增加,这样增加了代码的维护成本。

 

四、桥接模式 

桥接模式关系图

图解:  可以看出,我们把桥接模式分成了两大类,一个是款式,一个是品牌。品牌是电脑具体实现,而款式是抽象,两者进行了分离。

代码实现:

步骤一:定义一个品牌接口,定义方法,具体品牌来实现

  /**
 * @Author WangYan
 * @Date 2022/8/27 19:52
 * @Version 1.0
 * 品牌
 */
public interface Brand {

    void info();
}

/**
 * @Author WangYan
 * @Date 2022/8/27 20:22
 * @Version 1.0
 * 苹果品牌
 */
public class Apple implements Brand {
    @Override
    public void info() {
        System.out.print("苹果品牌");
    }
}
/**
 * @Author WangYan
 * @Date 2022/8/27 20:22
 * @Version 1.0
 * 联想品牌
 */
public class Lenove implements Brand {
    @Override
    public void info() {
        System.out.print("联想品牌");
    }
}

步骤二:定义电脑款式的抽象类,通过聚合的方式把具体实现和抽象结合在一起,充当桥接的作用

/**
 * @Author WangYan
 * @Date 2022/8/27 20:23
 * @Version 1.0
 * 电脑款式抽象类
 */
public abstract class Computer {

    // 聚合品牌接口
    protected Brand brand;

    // 通过构造函数传入品牌类型
    public Computer(Brand brand) {
        this.brand = brand;
    }

    /**
     * 调用品牌信息方法
     */
    public void info(){
        brand.info();
    }
}

步骤三 : 定义电脑款式并且继承电脑款式抽象类,通过构造方法来接受具体的品牌 

/**
 * @Author WangYan
 * @Date 2022/8/27 20:26
 * @Version 1.0
 * 笔记本款式
 */
public class Notebook extends Computer {
    public Notebook(Brand brand) {
        super(brand);
    }

    @Override
    public void info(){
        brand.info();
        System.out.println("笔记本");
    }
}

/**
 * @Author WangYan
 * @Date 2022/8/27 20:28
 * @Version 1.0
 * 台式款式
 */
public class Desktop extends Computer {
    public Desktop(Brand brand) {
        super(brand);
    }

    @Override
    public void info(){
        brand.info();
        System.out.println("台式");
    }
}

步骤四:Test测试,通过传入品牌,来创建一个具体款式的电脑

/**
 * @Author WangYan
 * @Date 2022/8/27 20:29
 * @Version 1.0
 * Test 测试类
 */
public class Test {
    public static void main(String[] args) {
        // 苹果台式
        Computer computer = new Desktop(new Apple());
        computer.info();

        // 联想笔记本
        Computer computer1 = new Notebook(new Lenove());
        computer1.info();
    }
}

扩展新的电脑款式或品牌

扩展一:扩展一个电脑的款式,只需要增加一个类就可以通用所有的品牌

/**
 * @Author WangYan
 * @Date 2022/8/27 22:01
 * @Version 1.0
 * 平板款式
 */
public class Ipad extends Computer {
    public Ipad(Brand brand) {
        super(brand);
    }

    @Override
    public void info(){
        brand.info();
        System.out.println("平板");
    }
}

/**
 * @Author WangYan
 * @Date 2022/8/27 20:29
 * @Version 1.0
 * Test 测试类
 */
public class Test {
    public static void main(String[] args) {
        // 平板款式
        Computer computer = new Ipad(new Apple());
        computer.info();
    }
}

扩展二:扩展一个品牌,只需要增加一个类就可以通用所有的电脑款式

/**
 * @Author WangYan
 * @Date 2022/8/27 22:05
 * @Version 1.0
 * 小米品牌
 */
public class XiaoMi implements Brand {
    @Override
    public void info() {
        System.out.print("小米品牌");
    }
}

/**
 * @Author WangYan
 * @Date 2022/8/27 20:29
 * @Version 1.0
 * Test 测试类
 */
public class Test {
    public static void main(String[] args) {
        // 平板款式
        Computer computer = new Notebook(new XiaoMi());
        computer.info();
    }
}

五、优缺点

优点:

  • 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统。符合开闭原则,就像一座桥,可以把两个变化维度连接起来!
  • 桥接模式比多继承方案更好的解决方法,极大的减少了子类的个数,从而减低管理和维护的成本

缺点:

  • 接模式的引入会增加系统的理解与设计难度,要求开发者针对抽象进行设计和编程
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此使用范围具有一定的局限性。

总结:

1.桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。

2.使用桥接模式需要注意应用场景,别为了设计模式而去使用设计模式,而是根据实际情况而定。

拜拜~

有任何问题欢迎大家指出~

Thank You !

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸航不吃瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值