【JAVA设计模式】桥接模式

464 阅读3分钟

桥接模式

在菜鸟教程上看到这么一段解释桥接模式的话,我觉得很通俗易懂,比官方解释好懂多了

如果你有3支不同笔尖的画笔,12种颜料,那么可以画出3 * 12种线条;而蜡笔想要做到同样的效果就需要36只。

前面的画笔就是桥接模式(笔不同型号是一个变化维度,不同颜色的颜料是一个变化维度,两个维度不相互影响),而后面的画笔就是多重继承(笔型号和颜料一起影响蜡笔)。理解以后我们将其抽象成代码描述:

pen类是一个抽象类,里面有一个方法draw()。我们想要使用画笔,则需要放入一种颜色,然后执行draw方法将这种颜色画出来。

看懂了吗?桥接模式本质上就是一个组合的运用,减少类的数量,拆分不同点然后将它们组合在一起,也能达到想要的效果。

除了减少类的数量以外,使用桥接模式还有什么好处吗?

好处当然是有滴~

最大的好处就是我们让不同类对象承担的任务独立出来,进行独立的扩展。比如我之前只有36只蜡笔,但是这36只蜡笔都画不出我想要的颜色,这个时候我只能去再"买"蜡笔,对吧?不使用桥接模式,我们就还得再定义一支有新颜色的笔,但是使用桥接模式,我们只需要定义一个新的颜色即可。这就省掉了我们去重复定义笔的属性的代码。笔和颜色之间的耦合度也低,笔该做啥就做啥,颜色想用到哪就用到哪,没有限制。

那它肯定也是有缺点的是吧?

肯定啊,这世上哪有完美的东西

像桥接模式,他的缺点也很明显。桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

简单来说,就是你如果不能够识别出笔和颜色这两个不同维度的话,你可能就不太能够很好的设计整个系统架构,把握不住啊

image-20211017105642034.png

附一个代码作业吧

汽车在路上行驶,有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。交通工具(汽车)有不同的类型,它们所行驶的环境(路)也在变化,设计软件系统适应两个方面的变化。

汽车抽象类

package Four.BirdgePattern;
​
abstract class Vehicle {
 abstract void run(Road road);
}

小汽车

package Four.BirdgePattern;
​
public class Car extends Vehicle {
    @Override
    void run(Road road) {
        System.out.println("我是小汽车");
        road.roadType();
    }
}

公共汽车

package Four.BirdgePattern;
​
public class Bus extends Vehicle{
    @Override
    void run(Road road) {
        System.out.println("我是公共汽车");
        road.roadType();
    }
}

路抽象类

package Four.BirdgePattern;
​
abstract class Road {
    abstract void roadType();
}

高速公路

package Four.BirdgePattern;
​
public class Highway extends Road{
    @Override
    void roadType() {
        System.out.println("这是高速公路");
    }
}

市区公路

package Four.BirdgePattern;
​
public class CityRoad extends Road{
    @Override
    void roadType() {
        System.out.println("这是市区公路");
    }
}

image-20211017110141918.png