Java-桥接-设计模式(九)

说明

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化,解耦合

UML
uml

代码

以不同的品牌的电脑安装运行不同类型的软件为例,电脑和软件就是上述的抽象与实现,将电脑和软件分离,二者没有任何继承或实现的关系,通过桥接模式来完成二者的聚合,代码如下。

抽象出来的电脑,可以有不同品牌,将软件作为属性

/**
 * @author ctl
 * @date 2021/1/20
 * 电脑,可以有不同品牌
 */
public abstract class Computer {

    protected Software software;

    public void setSoftWare(Software softWare) {
        this.software = softWare;
    }

    public abstract void run();
}

A品牌的电脑

/**
 * @author ctl
 * @date 2021/1/20
 * A品牌的电脑
 */
public class ComputerA extends Computer {

    @Override
    public void run() {
        System.out.println("A品牌的电脑开始运行程序...");
        this.software.run();
    }
}

B品牌的电脑

/**
 * @author ctl
 * @date 2021/1/20
 * B品牌的电脑
 */
public class ComputerB extends Computer {

    @Override
    public void run() {
        System.out.println("B品牌的电脑开始运行程序...");
        this.software.run();
    }
}

软件顶级接口

/**
 * @author ctl
 * @date 2021/1/20
 * 电脑要安装的软件,可以有不同种类
 */
public interface Software {

    void run();
}

编码软件

/**
 * @author ctl
 * @date 2021/1/20
 * 编码软件
 */
public class CodeSoftware implements Software {

    @Override
    public void run() {
        System.out.println("编码软件运行...");
    }
}

画图软件

/**
 * @author ctl
 * @date 2021/1/20
 * 画图软件
 */
public class DrawSoftware implements Software {

    @Override
    public void run() {
        System.out.println("画图软件运行...");
    }
}

测试类

/**
 * @author ctl
 * @date 2021/1/20
 * Computer与SoftWare间没有任何继承或实现的关系,是通过桥接模式来进行的聚合
 * 可以分别扩展Computer的类型和SoftWare的类型,互不影响
 * <p>
 * 如果不用这种模式,可能会将Computer作为顶级接口或顶级父类,然后各个品牌的Computer继承或实现顶级Computer
 * 再将SoftWare作为各个品牌Computer的属性或子类,这样Computer和SoftWare就耦合在了一起,不利于扩展
 */
public class BridgeMain {

    public static void main(String[] args) {
        Computer computer;

        computer = new ComputerA();
        computer.setSoftWare(new CodeSoftware());
        computer.run();
        computer.setSoftWare(new DrawSoftware());
        computer.run();
        System.out.println("-----------分割线----------");
        computer = new ComputerB();
        computer.setSoftWare(new DrawSoftware());
        computer.run();
        computer.setSoftWare(new CodeSoftware());
        computer.run();
    }
}

结果
结果
如在测试类中的注释所说,Computer与Software没有任何继承或实现的关系,如果Computer的类型和Software可以分别进行扩展互不干扰,并且不会影响原有的代码逻辑。
若不用桥接模式,假设将Computer作为顶级接口或顶级父类,然后每个品牌的电脑作为抽象类实现Computer接口,再把software作为子类,调用时去调用software实现类的方法,这样就不利于扩展了,并且继承关系非常复杂。

总结

文章开头有三个关键词:抽象、实现、解偶

抽象对应的就是这个demo中的computer。
抽象指的是某个相同类型,存在于多个实体中的共同的概念关系,即不同品牌的电脑都是电脑。。

实现对应的就是software。
实现指的是抽象化给出的具体实现,比如真正run起来的是软件,而不是电脑。

解耦指的是将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥接模式中的所谓解耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥接模式的用意。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值