`
gcq04552015
  • 浏览: 462173 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java模式之 桥接模式Briage

    博客分类:
  • java
 
阅读更多
Bridge模式的概念

Bridge 模式是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

Bridge模式的应用场景

面向对象的程序设计(OOP)里有类继承(子类继承父类)的概念,如果一个类或接口有多个具体实现子类,如果这些子类具有以下特性:
- 存在相对并列的子类属性。
- 存在概念上的交叉。
- 可变性。
我们就可以用Bridge模式来对其进行抽象与具体,对相关类进行重构。

为了容易理解,我们举例说明一下,比如汽车类(Car),假设有2个子类,卡车类(Truck)与公交车类(Bus),它们有[设置引擎]这个动作行为,通过不同引擎规格的设置,可以将它们设置为比如为1500cc(Car1500),和2000cc(Car2000)的车。
这样,不管是1500cc的卡车还是2000cc的卡车,又或是1500cc的公交车还是2000cc的公交车,它们都可以是汽车类的子类,而且:
- 存在相对并列的子类属性。汽车的种类,与汽车引擎规格是汽车的2个并列的属性,没有概念上的重复。
- 存在概念上的交叉。不管是卡车还是公交车,都有1500cc与2000cc引擎规格的车。
- 可变性。除了卡车,公交车之外,可能还有救火车;除了有1500cc与2000cc引擎规格的车之外,还可能有2500cc的车等等。

这样一来,我们怎么来设计汽车类呢?

方法一

通过继承设计所有可能存在的子类。可能我们会想到下面的这种继承关系:
汽车总类:Car
汽车子类 - 按种类分类:Bus,Truck
汽车子类 - 按引擎分类:Bus1500,Bus2000,Truck1500,Truck2000
这样设置引擎这个动作就由各个子类加以实现。

但如果以后需要增加一种救火车(FireCar),以及增加一个引擎规格2500cc,需要实现的子类将会有:
Bus1500,Bus2000,Bus2500,Truck1500,Truck2000,Truck2500,FireCar1500,FireCar2000,FireCar2500 多达9个。
也就是说,这种设计方法,子类数目将随几何级数增长。
而且,Bus1500,Truck1500的引擎规格相同,它们的引擎设置动作应该是一样的,但现在把它们分成不同的子类,难以避免执行重复的动作行为。

方法二

分别为Bus以及Truck实现设置不同引擎的方法
汽车总类:Car
汽车子类:Bus,Truck

然后在Bus类里分别提供1500cc以及2000cc引擎的设置方法:
Bus extends Car {
    public setEngine1500cc();
    public setEngine2000cc();
}

在Truck类里也分别提供1500cc以及2000cc引擎的设置方法:
Truck extends Car {
    public setEngine1500cc();
    public setEngine2000cc();
}

这种情况,子类的数量是被控制了。但一方面,如果每增加一种引擎规格,需要修改所有的汽车子类;另一方面,即使引擎的设置行为一样,但是不同的汽车子类却需要提供完全一样的方法。

在实际的应用开发中,以上2种方法都会造成迁一发而动全身,而且会存在大量的重复代码。

Bridge模式可以很好的解决这类问题。

Client
    Bridge模式的使用者
Abstraction
    抽象类接口(接口或抽象类)
    维护对行为实现(Implementor)的引用
Refined Abstraction
    Abstraction子类
Implementor
    行为实现类接口 (Abstraction接口定义了基于Implementor接口的更高层次的操作)
ConcreteImplementor
    Implementor子类

Bridge模式的应用范例

我们来看看怎么应用Bridge模式来设计汽车类。

抽象 - Abstraction类:汽车类及其子类:
Car:汽车总类
Truck:汽车子类 - 卡车类。
Bus:汽车子类 - 公交车类。

行为实现 - Implementor:汽车引擎设置的行为类及子类
SetCarEngine:汽车引擎的设置接口
SetCarEngine1500cc:设置1500cc引擎
SetCarEngine2000cc:设置2000cc引擎

代码:

package zieckey.designpatterns.study.bridge;

//测试

public class Client
{
    public static void main( String[] argv )
    {
        Engine engine1500 = new Engine1500CC();
        Engine engine2200 = new Engine2200CC();
      
        Vehicle bus1500 = new Bus( engine1500 );
        Vehicle bus2200 = new Bus( engine2200 );
        bus1500.setEngine();
        bus2200.setEngine();
      
        Vehicle truck1500 = new Truck( engine1500 );
        Vehicle truck2200 = new Truck( engine2200 );
        truck1500.setEngine();
        truck2200.setEngine();
    }
}

package zieckey.designpatterns.study.bridge;

/**
*
* 汽车类(Vehicle),假设有2个子类,卡车类(Truck)与公交车类(Bus),
* 它们有[设置引擎]这个动作行为,通过不同引擎规格的设置,
* 可以将它们设置为比如为1500cc(Car1500),和2000cc(Car2000)的车。
* 这样,不管是1500cc的卡车还是2000cc的卡车,又或是1500cc的公交车还是2000cc的公交车,它们都可以是汽车类的子类,而且:
*     - 存在相对并列的子类属性。汽车的种类,与汽车引擎规格是汽车的2个并列的属性,没有概念上的重复。
*     - 存在概念上的交叉。不管是卡车还是公交车,都有1500cc与2000cc引擎规格的车。
*     - 可变性。除了卡车,公交车之外,可能还有救火车;除了有1500cc与2000cc引擎规格的车之外,还可能有2500cc的车等等。
*
* @author
* @since 2008/06/23
*/
public abstract class Vehicle
{
    private Engine engine;

    Vehicle( Engine engine )
    {
        this.setEngine( engine );
    }
  
    public abstract void setEngine();

    public void setEngine( Engine engine )
    {
        this.engine = engine;
    }

    public Engine getEngine()
    {
        return engine;
    }
}

package zieckey.designpatterns.study.bridge;

//Abstraction子类:这里为汽车抽象类的子类

public class Bus extends Vehicle
{
    public Bus( Engine engine)
    {
        super( engine );
    }
  
    @Override
    public void setEngine()
    {
        System.out.print("Set Bus Engine: ");
        getEngine().setEngine();
    }
}

package zieckey.designpatterns.study.bridge;

//Abstraction子类:这里为汽车抽象类的子类

public class Truck extends Vehicle
{
    public Truck( Engine engine )
    {
        super( engine );
    }

    @Override
    public void setEngine()
    {
        System.out.print("Set Truck Engine: ");
        getEngine().setEngine();
    }

}

package zieckey.designpatterns.study.bridge;

//汽车类的行为接口

public interface Engine
{
    public void setEngine();
}

package zieckey.designpatterns.study.bridge;

/** ConcreteImplementor */
//行为实现子类

public class Engine2200CC implements Engine
{

    public void setEngine()
    {
        System.out.println("engine 2200CC");
    }  
  
}

package zieckey.designpatterns.study.bridge;

/** ConcreteImplementor */
//行为实现子类

public class Engine1500CC implements Engine
{

    public void setEngine()
    {
        System.out.println("engine 1500CC");
    }  
  
}



小结:Bridge模式是一种抽象与其实现相分离的模式。它主要应用于:当事物是一组变化量,和对这些事物的操作方法(实现)也是一组变化量的情况,也就是说它们都是多变的
分享到:
评论

相关推荐

    Java调AutoCAD接口.zip

    Java调用AutoCAD接口是一项技术性很强的工作,它允许开发者使用Java编程语言来控制和操作AutoCAD应用程序,实现自动化绘图、数据交换等任务。在本压缩包中,"Java调AutoCAD接口.zip"提供了使用Jacob库进行这项工作的...

    基于多传感器的智能小车模型结项PPT.ppt

    电机驱动模块采用了 1 个电机来控制后轮,另外一个电机控制前轮,单片机 AT89C51 和 H - Briage 驱动电路 L293D 用来控制方向和电机的速度。 软件设计 软件设计是微机控制系统设计的关键部分,需要根据每个生产...

    FOX LOGO 富士康主板LOGO更改

    上次的是945以下的板子,这个是支持H61之类,看下面支持的类型。 5. Supported OS and Platforms ============================= - Foxconn MB - Windows XP - Windows Vista - Windows 7 6. Qualification ...

    基于STM32单片机的激光雕刻机控制系统设计-含详细步骤和代码

    内容概要:本文详细介绍了基于STM32单片机的激光雕刻机控制系统的设计。系统包括硬件设计、软件设计和机械结构设计,主要功能有可调节激光功率大小、改变雕刻速率、手动定位、精确雕刻及切割。硬件部分包括STM32最小系统、步进电机驱动模块、激光发生器控制电路、人机交互电路和串口通信电路。软件部分涉及STM32CubeMX配置、G代码解析、步进电机控制、激光功率调节和手动定位功能的实现。 适合人群:对嵌入式系统和激光雕刻机感兴趣的工程师和技术人员。 使用场景及目标:① 适用于需要高精度激光雕刻的应用场合;② 为开发类似的激光雕刻控制系统提供设计参考。 阅读建议:本文提供了详细的硬件和软件设计方案,读者应结合实际应用场景进行理解,重点关注电路设计和代码实现。

    白色简洁风格的前端网站模板下载.zip

    白色简洁风格的前端网站模板下载.zip

    HarmonyException如何解决.md

    HarmonyException如何解决.md

    sdfsdfdsfsdfs222

    sdfsdfdsfsdfs222

    (177373454)html+css+js学习代码.zip

    html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+js学习代码 html+css+js学习代码html+css+js学习代码html+css+j

    usbgps2.apk

    usbgps2.apk

    白色简洁风格的家居建材网站模板下载.zip

    白色简洁风格的家居建材网站模板下载.zip

    EventEmitError解决办法.md

    EventEmitError解决办法.md

    白色简洁风格的工艺品展览企业网站源码下载.zip

    白色简洁风格的工艺品展览企业网站源码下载.zip

    matlab调制解调 OFDM OTFS 16qam qpsk ldpc turbo在高斯白噪声,频率选择性衰落信道下的误比特率性能仿真,matlab代码 OFDM simulink 包括添加保

    matlab调制解调 OFDM OTFS 16qam qpsk ldpc turbo在高斯白噪声,频率选择性衰落信道下的误比特率性能仿真,matlab代码 OFDM simulink 包括添加保护间隔(cp),信道均衡(ZF MMSE MRC MA LMSEE) 代码每行都有注释,适用于学习,附带仿真说明,完全不用担心看不懂

    build(1).gradle

    build(1).gradle

    贴标飞达sw16全套技术资料100%好用.zip

    贴标飞达sw16全套技术资料100%好用.zip

    其实这就是历年摘出来的

    其实这就是历年摘出来的

    地理遥感图像区域合并分割的大规模高效算法研究

    内容概要:本文针对大规模高分辨率遥感图像的处理问题,提出了一种基于图像分块的可扩展区域合并分割框架。传统的图像分块方法会导致分块边界上的伪影,影响最终结果。为解决这一问题,文中定义了稳定性边缘的概念,并给出了其数学表达,以确保分割结果与不分块时相同。此外,文章还介绍了一种高效的框架实现方法,用于在资源受限的设备上处理大型图像。 适合人群:从事遥感图像处理、计算机视觉及地理信息系统相关领域的研究人员和技术人员。 使用场景及目标:适用于需要处理大规模高分辨率遥感图像的应用场景,如环境监测、自然资源管理等。主要目标是提供一种能够高效处理大规模图像同时保持分割质量的方法。 其他说明:实验结果表明,所提出的算法不仅能够避免分块边界的伪影,而且能够在不同尺度下获得与不分块处理相同的分割结果。

    白色简洁风格的手机图片展示博客网站模板.rar

    白色简洁风格的手机图片展示博客网站模板.rar

    白色简洁风格的外科医疗整站网站源码下载.zip

    白色简洁风格的外科医疗整站网站源码下载.zip

Global site tag (gtag.js) - Google Analytics