设计模式之(九)桥接模式(Bridge)

  桥接模式是怎么诞生的呢?来看一个场景。

  一个软件企业开发一套系统,要兼容所有的不同类型硬件和和各种操作系统。不同种类硬件主要是 电脑、平板电脑、手机。各种操作系统是苹果系统、windows 系统、Linux 系统。设计人员给出了需要适配的类图。

这个设计根据列出来了需要创建的 7 个类。通过集成的方式来实现。这样就实现了软件如要适配的软硬件的需要。但是有什么问题呢。很显然就是扩展起来笔记麻烦。例如:华为的鸿蒙操作系统出来了,而且是手机、平板、电脑都能用的操作系统。这样我们就需要扩展 3 个类。这还是简单的业务情况。要是复杂再复杂些的。那么这样的扩展就比较麻烦。那么接下来我们接触的 桥接模式就能够很好的解决这个问题。先看下桥接模式的定义:

 将抽象部分与实现部分分离,使它们都可以独立的变化。

这种定义我总是弄不清除抽象部分和实现部分,都值得是什么。但是后面的 都可以独立的变化 看明白了。通过看其他的一些文档。实际就是在业务场景中有两个及以上的维度变化时,把不同的维度都独立成类,某个维度的类变化影响不到另外一个维度的变化即可。然后在需要使用的试用使他们通过聚合的方式联系起来一起工作。这种聚合犹如桥梁,因此这种解决问题设计方式就叫桥接模式。

通过桥接模式的分析上面的业务场景。  首先来分析变化维度,很明显操作系统是一个维度;各类硬件是一个维度。根据交接模式改造一下上面的结构:

接下来用简单的单位实现一下这个设计示意图。

// 硬件抽象类
public abstract class AbstractHardware {

    private SoftwareOS os;

    public AbstractHardware(SoftwareOS os){
        this.os = os;
    }

    public SoftwareOS getOs() {
        return os;
    }

    public abstract void runOS();
}

//电脑,继承硬件抽象类
public class Computer extends AbstractHardware {

    public Computer(SoftwareOS os) {
        super(os);
        // TODO Auto-generated constructor stub
    }

    public void runOS(){
        String Str = this.getOs().funRun();
        System.out.println("电脑类兼容:"+Str);
    }

}

//手机类,继承硬件抽象类
public class Cellphone extends AbstractHardware{

    public Cellphone(SoftwareOS os) {
        super(os);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void runOS() {
        // TODO Auto-generated method stub
        String str = this.getOs().funRun();
        System.out.println("手机兼容:"+str);
    }

}

//平板电脑类,继承硬件抽象类
public class boardCom extends AbstractHardware {
       ......
}
//操作系统接口
public interface SoftwareOS {

    public String funRun();
}

//苹果操作系统,实现操作系统接口
public class Mac implements SoftwareOS {

    @Override
    public String funRun() {
        // TODO Auto-generated method stub
        return "Mac 操作系统";
    }
}

//安卓操作系统,继承操作系统接口
public class Andriod implements SoftwareOS {

    @Override
    public String funRun() {
        // TODO Auto-generated method stub
        return " Andriod 操作系统";
    }

}

// Linux 类,实现操作系统接口
public class Linux implements SoftwareOS {

    @Override
    public String funRun() {
        // TODO Auto-generated method stub
        return "Linux 操作系统";
    }

}

// Windows 类,实现操作系统接口
public class Windows implements SoftwareOS {

    @Override
    public String funRun() {
        // TODO Auto-generated method stub
        return "Windows 操作系统";
    }
}
// 测试类
public class Client {
    public static void main(String[] args) {

        // 电脑类兼容配置
        AbstractHardware computer = new Computer(new Mac());
        computer.runOS();

        computer = new Computer(new Linux());
        computer.runOS();

        //手机类兼容配置
        AbstractHardware cphone = new Cellphone(new Andriod());
        cphone.runOS();

        cphone = new Cellphone(new Mac());
        cphone.runOS();

        // 平板电脑兼容配置 .....

    }
}

/**************************结果*****************************/

    电脑类兼容:Mac 操作系统
    电脑类兼容:Linux 操作系统
    
    手机兼容: Andriod 操作系统
    手机兼容:Mac 操作系统
    

  随着科技产业的不断发展,华为开发出来全方位操作系统:鸿蒙,这时候就需要扩展操作系统这个维度的类。扩展如下:

//鸿蒙操作系统,实现操作系统接口
public class HongMeng implements SoftwareOS {

    @Override
    public String funRun() {
        // TODO Auto-generated method stub
        return "鸿蒙 操作系统";
    }

}

// 测试类
public class Client {
    public static void main(String[] args) {

        // 电脑类兼容配置
        AbstractHardware computer = new Computer(new HongMeng());
        computer.runOS();
        //手机类兼容配置
        AbstractHardwarecphone = new Cellphone(new HongMeng());
        cphone.runOS();

        // 平板电脑兼容配置 .....
    }
}
/**************************结果*****************************/
    电脑类兼容:鸿蒙 操作系统    手机兼容:鸿蒙 操作系统

分析桥接模式

  通过上面的例子,我们看出来,桥接模式通过把业务场景中不同的两个维度独立了出来,在试用的时候根据需要类配合试用,调用的时候更加灵活。而且需要扩展时,只需要扩展有变化的维度即可。

  如果不用桥接模式,那么就需要 电脑、平板电脑、手机都扩展鸿蒙操作系统的类,如果是实际运用中场景更复杂,扩展的工作量就更大。

  另外也体现了开闭原则。因为扩展时候顶层的抽样类和接口是不变化的,两个维护的关联也是不变的,只需要根据扩展添加新类即可。

通过这个设计模式的代码实现方式,我们也总结一下:继承的耦合性更强,而组合或者说是聚合的灵活性更高。

  那么这个模式的本质是什么呢:就是分析业务场景变化维度。然后让不同的维度相互独立,一个维度变化另外一个维度不用跟着修改,使得代码更容易扩展。

原文地址:https://www.cnblogs.com/pengweiqiang/p/11072384.html

时间: 2024-11-08 21:47:59

设计模式之(九)桥接模式(Bridge)的相关文章

设计模式入门之桥接模式Bridge

//桥接模式定义:将抽象部分与它的实现部分分离,使得他们都可以独立地变化 //广义来讲,桥接模式非常普遍,面向抽象编程,面向接口编程就可以看作是他的体现 //实例:一个系统,要按照不同的要求发信息(普通,加急,特急),而且还要以不同的方式发送(站内信,Email,短信)等,考虑到其扩展性,用桥接模式再合适不过了 //上代码 //桥接的一半---抽象部分 public abstract class AbstractionMessage { protected MessageImplementor

设计模式之【桥接模式--Bridge】

桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了;

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

【设计模式】桥接模式 Bridge Pattern

开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号,各种颜色种类繁多, 假如一盒蜡笔有24种颜色,那么它能涂抹出24种不同的颜色来,蜡笔型号是固定的,如果想画出各种线条那么就要购买不同型号的蜡笔,假如我们要涂抹出粗,中,细三种线条,那么我们就要买3盒粗,中,细型号的蜡笔才能满足需求,那么就是3盒*24色=72只蜡笔.假如使用毛笔来作画,我们需要准备3只粗,中,

二十四种设计模式:桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象部分和实现部分分离. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Bridge { /// <summary> /// Message实体类 //

JavaScript设计模式样例九 —— 桥接模式

桥接模式(Bridge Pattern) 定义:是用于把抽象化与实现化解耦,使得二者可以独立变化. 目的:将抽象部分与实现部分分离,使它们都可以独立的变化. 场景:实现系统可能有多个角度分类,每一种角度都可能变化. let each = (arr, fn) => { for (let i = 0; i < arr.length; i++) { let val = arr[i] if (fn.call(val, i, val, arr)) { return false } } } let arr

Java设计模式系列之桥接模式

桥接模式(Bridge)的定义 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 桥接模式(Bridge)的动机 当一种抽象类型可能有多种实现方式时,一般情况我们可以考虑使用继承来解决抽象类型的多种实现,在抽象类型中定义接口,而子类负责接口的具体实现.但这种做法缺乏灵活性,由于抽象类型和子类之间紧紧地绑定在一起,使得这种关系在运行时不能再修改,这使得它难以修改.扩展和重用

桥接模式&lt;Bridge&gt;

概述 将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化. 解决 在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化.为了解决这种多维度变化,又不引入复杂度,这就要使用Bridge模式. 角色 抽象(Abstraction):定义抽象接口,该接口中包含(保持)实现具体行为.具体特征的实现(Implementor)接口. 提炼的抽象(RefinedAbstraction):继承自Abstraction的子类,依旧是一个抽象的事物名. 实

桥接模式(bridge结构模式)c#

桥接模式(bridge结构模式)c#简单例子 在前面的玩家中每增加一个行为,就必须在每个玩家中都增加,通过桥接模式将行为提取出来了,减少变化 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Fo

c#桥接模式(bridge结构模式)

桥接模式(bridge结构模式)c#简单例子 在前面的玩家中每增加一个行为,就必须在每个玩家中都增加,通过桥接模式将行为提取出来了,减少变化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62