设计模式(七)桥接模式

2022-05-05 20:04:18 浏览数 (1)

参考资料:设计模式—–桥接模式(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和高速公路与市区道路的组合,我们需要编写两个实现类,分别继承道路和汽车两个接口。对于吉普车同样需要重复这样的工作。

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

0 人点赞