桥接模式
在菜鸟教程上看到这么一段解释桥接模式的话,我觉得很通俗易懂,比官方解释好懂多了
如果你有3支不同笔尖的画笔,12种颜料,那么可以画出3 * 12种线条;而蜡笔想要做到同样的效果就需要36只。
前面的画笔就是桥接模式(笔不同型号是一个变化维度,不同颜色的颜料是一个变化维度,两个维度不相互影响),而后面的画笔就是多重继承(笔型号和颜料一起影响蜡笔)。理解以后我们将其抽象成代码描述:
pen类是一个抽象类,里面有一个方法draw()。我们想要使用画笔,则需要放入一种颜色,然后执行draw方法将这种颜色画出来。
看懂了吗?桥接模式本质上就是一个组合的运用,减少类的数量,拆分不同点然后将它们组合在一起,也能达到想要的效果。
除了减少类的数量以外,使用桥接模式还有什么好处吗?
好处当然是有滴~
最大的好处就是我们让不同类对象承担的任务独立出来,进行独立的扩展。比如我之前只有36只蜡笔,但是这36只蜡笔都画不出我想要的颜色,这个时候我只能去再"买"蜡笔,对吧?不使用桥接模式,我们就还得再定义一支有新颜色的笔,但是使用桥接模式,我们只需要定义一个新的颜色即可。这就省掉了我们去重复定义笔的属性的代码。笔和颜色之间的耦合度也低,笔该做啥就做啥,颜色想用到哪就用到哪,没有限制。
那它肯定也是有缺点的是吧?
肯定啊,这世上哪有完美的东西
像桥接模式,他的缺点也很明显。桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
简单来说,就是你如果不能够识别出笔和颜色这两个不同维度的话,你可能就不太能够很好的设计整个系统架构,把握不住啊
附一个代码作业吧
汽车在路上行驶,有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。交通工具(汽车)有不同的类型,它们所行驶的环境(路)也在变化,设计软件系统适应两个方面的变化。
汽车抽象类
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("这是市区公路");
}
}