桥接模式【java版】

应用场景:

      某个类型具有两个或多个维度,实现抽象与行为的分离,防止"行为代码模块"冗余.

一、基本结构

       组成:
         行为接口: 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();
}
}

       运行结果:

原文地址:https://www.cnblogs.com/edisonfeng/p/2302239.html