应用场景:
某个类型具有两个或多个维度,实现抽象与行为的分离,防止"行为代码模块"冗余.
一、基本结构
组成:
行为接口: 1个,定义了通用的行为方法
具体行为类: 多个,具体实现行为接口中指定的行为方法
抽象类: 1个,定义了通用的行为方法,供外部调用,通常方法名与"行为接口"中的方法名相同.
抽象类具体实现: 若干个,通过其中一个维度,具体定义抽象类
行为接口:
public interface Engine {//行为接口
public void setEngine();
}
具体行为类一:
public class Engine1500CC implementsEngine {//1500CC发动机引擎
public void setEngine() {
System.out.println("发动机引擎为1500CC!");
}
}
具体行为类二:
public class Engine2000CC implementsEngine {//2000CC发动机引擎
public void setEngine() {
System.out.println("发动机引擎为2000CC!");
}
}
具体行为类三:
public class Engine4000CC implementsEngine {//4000CC发动机引擎
public void setEngine() {
System.out.println("发动机引擎为4000CC!");
}
}
具体行为类四:
public class Engine6500CC implementsEngine {//6500CC发动机引擎
public void setEngine() {
System.out.println("发动机引擎为6500CC!");
}
}
抽象类:
public abstract class Vehicle {
private Engine engine;//使用聚合
public Vehicle(Engine engine) {
this.engine=engine;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
//供外部调用的“设置行为”的方法,由子类实现
public abstract void setEngine();
}
抽象类具体实现一:
//定义轿车类
public class Car extends Vehicle {
public Car(Engine engine) {
super(engine);
}
@Override
public void setEngine() {
System.out.println("设置Car的发动机引擎。");
super.getEngine().setEngine();
}
}
抽象类具体实现二:
//定义公交车类
public class Bus extends Vehicle {
public Bus(Engine engine) {
super(engine);
}
@Override
public void setEngine() {
System.out.println("设置Bus的发动机引擎。");
super.getEngine().setEngine();
}
}
抽象类具体实现三:
//定义卡车类
public class Truck extends Vehicle {
public Truck(Engine engine) {
super(engine);
}
@Override
public void setEngine() {
System.out.println("设置Truck的发动机引擎。");
super.getEngine().setEngine();
}
}
说明:使用桥接模式的好处
如果使用传统的继承方式,则终端类的个数为: 3*4=12(m*n)
而使用桥接模式,则终端类的个数为:3+4=7(m+n)
最重要的是,桥接模式可以有效防止"行为代码模块"冗余.
附:模式是为了变化,不要为了模式而模式,我们只需要抽离出变化点就可以了。
二、测试
测试代码:
public class Main {
public static void main(String[] args) {
System.out.println("开始测试桥接模式。。。");
//创建可能出现的各种引擎的实例(行为实例)
Engine engine1500CC=new Engine1500CC();
Engine engine2000CC=new Engine2000CC();
Engine engine4000CC=new Engine4000CC();
Engine engine6500CC=new Engine6500CC();
//创建各种交通工具的实例
Vehicle firstCar=new Car(engine1500CC);
Vehicle secondCar=new Car(engine2000CC);
Vehicle firstBus=new Bus(engine4000CC);
Vehicle firstTruck=new Truck(engine6500CC);
//执行各个交通工具的行为
System.out.println();
firstCar.setEngine();
System.out.println();
secondCar.setEngine();
System.out.println();
firstBus.setEngine();
System.out.println();
firstTruck.setEngine();
}
}
运行结果: