随笔分类
桥接模式
Bridge模式
结构型模式之一
Bridge模式基于类的最小设计原则,通过使用封装、聚合以及继承等行为来让不同的类承担不同的职责。
把抽象和实现分离开,从而可以保证各部分的独立性以及应对它们的功能扩展
为什么要有这个模式呢?
先来看看一个小案例
public interface Car {
void installEngine();
}
public abstract class Bus implements Car{
public abstract void installEngine();
}
public class BigBus extends Bus{
@Override
public void installEngine() {
System.out.println("install big engine");
}
}
public class SmallBus extends Bus{
@Override
public void installEngine() {
System.out.println("install small engine");
}
}
public class MainClass {
public static void main(String[] args) {
Car car = new BigBus();
car.installEngine();//install big engine
}
}
缺点很多对吧
每一个engine对应一个子类,如果还有别的车(吉普之类的),吉普也有很多安装引擎的选择,这样就不得不将吉普抽象化,让其子类去实现具体种类enginr的安装,当车类别很多,引擎选择多时,这无疑是一种灾难(Bad Design)
怎么解决呢?
将具体引擎的安装方法抽象在Car不就能解决了吗,且节省了很多的子类
但是这样的话问题又来了:
- 当接口中新增方法时,又要去改变子类的实现,违背了开闭原则
- 子类并不一定都有接口中声明的engine规格的安装,只能给个空的实现了,这也是不太好的
这又该怎么解决呢?
想一想
问题究极到底还是engine规格的增加
那么将engine抽离成一个接口,规格增加即新增一个实现类即可
Car里只放车的种类即可
那么二者怎么进行联系呢?
保存一个引用不就解决了吗?QAQ
结构图
所以说桥接的本质的本质是保存一个引用来进行联系
public interface Engine {
void installEngine();
}
public class Engine2000 implements Engine{
@Override
public void installEngine() {
System.out.println("install 2000cc engine");
}
}
public class Engine2200 implements Engine{
@Override
public void installEngine() {
System.out.println("install 2200cc engine");
}
}
public abstract class Car {
private Engine engine; //桥接本质:保存一个引用
public Engine getEngine() {
return engine;
}
public Car(Engine engine) {
this.engine = engine;
}
void installEngine(){};
}
public class Bus extends Car{
public Bus(Engine engine) {
super(engine);
}
@Override
void installEngine() {
System.out.println("Bus:");
this.getEngine().installEngine();
}
}
public class Jeep extends Car {
public Jeep(Engine engine) {
super(engine);
}
@Override
void installEngine() {
System.out.println("Jeep:");
this.getEngine().installEngine();
}
}
/**
* Bus:
* install 2000cc engine
* Jeep:
* install 2200cc engine
*/
public class MainClass {
public static void main(String[] args) {
Engine engine = new Engine2000();
Engine engine2 = new Engine2200();
Car bus = new Bus(engine);
bus.installEngine();
Car jeep = new Jeep(engine2);
jeep.installEngine();
}
}
这便是桥接模式的精髓所在了