前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(七)桥接模式

设计模式(七)桥接模式

作者头像
乐百川
发布2022-05-05 20:04:18
1840
发布2022-05-05 20:04:18
举报

参考资料:设计模式—–桥接模式(Bridge Pattern)。一开始我看的是菜鸟教程上的桥接模式,但是它讲的很垃圾,我看了半天没看明白,又查阅了这一篇,终于算是理解桥接模式了。

桥接模式也是一种结构型模式,用来解决软件系统中多维度的变化。假如只有一个维度的变化,我们可以直接重写多个子类来解决。但是如果有两个维度同时变化呢?试想一下,汽车在道路上行驶,汽车有轿车、SUV之分,而道路又分为高速公路、市区道路等等。怎样抽象才能使这两者同时变化而不用修改系统呢?

首先我们来编写道路的抽象。

代码语言:javascript
复制
public interface Road {
    String getName();
}

class HighWayRoad implements Road {

    @Override
    public String getName() {
        return "高速公路";
    }
}

class TownStreetRoad implements Road {

    @Override
    public String getName() {
        return "市区公路";
    }
}

然后来编写汽车的抽象。

代码语言:javascript
复制
public abstract class Car {
    protected Road road;
    protected String car;

    public Car(Road road, String car) {
        this.road = road;
        this.car = car;
    }

    abstract void drive();
}

class Jeep extends Car {
    public Jeep(Road road, String car) {
        super(road, car);
    }

    @Override
    public void drive() {
        System.out.println(car + "on" + road.getName());
    }
}

class SUV extends Car {
    public SUV(Road road, String car) {
        super(road, car);
    }

    @Override
    void drive() {
        System.out.println(car + "on" + road.getName());
    }
}

最后来运行一下。

代码语言:javascript
复制
Road highway = new HighWayRoad();
Road street = new TownStreetRoad();
Car jeep = new Jeep(highway, "吉普");
jeep.drive();
Car suv = new SUV(street, "SUV");
suv.drive();

乍看一下桥接模式好像没有什么特别的,我们需要和其他方式比较一下。假设我们不使用桥接模式来实现上面的例子,一种方式就是创建多个子类,分别实现这些接口。为了实现SUV和高速公路与市区道路的组合,我们需要编写两个实现类,分别继承道路和汽车两个接口。对于吉普车同样需要重复这样的工作。

所以这里就体现出了桥接模式的特点:将一个抽象添加到另一个抽象中,也就是使用组合而非继承的方式。这样系统的两个部分就可以分别变化而不会互相影响了。这也正是桥接模式的本意:让抽象和实现分离,两部分可以互相变化而不影响。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档