zoukankan      html  css  js  c++  java
  • 桥接模式【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();
    }
    }

           运行结果:

  • 相关阅读:
    Asp.net Core 系列之--5.认证、授权与自定义权限的实现
    Asp.net Core 系列之--4.事务、日志及错误处理
    Asp.net Core 系列之--3.领域、仓储、服务简单实现
    Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作
    Asp.net Core 系列之--1.事件驱动初探:简单事件总线实现(SimpleEventBus)
    Cocos2d-x项目创建
    Cocos2d-x编译Android环境
    Linux 之 RPM
    Channels实现扫码登录
    SQLALchemy中关于复杂关系表模型的映射处理
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2302239.html
Copyright © 2011-2022 走看看