• 桥接模式【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();
    }
    }

           运行结果:

  • 相关阅读:
    LeetCode:Length of Last Word
    Team Queue(POJ 2259)
    LeetCode:Largest Rectangle in Histogram(update)
    bzoj4821 && luogu3707 SDOI2017相关分析(线段树,数学)
    luogu1438无聊的数列(区间加等差数列,求一个数的和)
    luogu1081 开车旅行2012 D1T3 (倍增,set,O2)
    bzoj4094 && luogu3097 最优挤奶
    luogu3888 GDOI2014拯救莫里斯 (状压dp)
    noip2017D1T3逛公园(拓扑图上dp,记忆化搜索)
    bzoj1065 NOI2008奥运物流 (dp,树上背包,推式子)
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2302239.html
Copyright © 2020-2023  润新知