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

  一个软件企业开发一套系统,要兼容所有的不同类型硬件和和各种操作系统。不同种类硬件主要是 电脑、平板电脑、手机。各种操作系统是苹果系统、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(); // 平板电脑兼容配置 .....
}
}
/**************************结果*****************************/
    电脑类兼容:鸿蒙 操作系统
    手机兼容:鸿蒙 操作系统

分析桥接模式

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

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

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

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

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

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

  1. Net设计模式实例之桥接模式( Bridge Pattern)

    一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...

  2. 设计模式学习心得<桥接模式 Bridge>

    说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...

  3. IOS设计模式浅析之桥接模式(Bridge)

    引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...

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

    Abstraction:抽象部分的父类,定义须要实现的接口.维护对实现部分的引用,从而把实现桥接到Implementor中去 Implementor:实现部分的接口 RefinedAbstractio ...

  5. 《JAVA设计模式》之桥接模式(Bridge)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...

  6. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

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

    开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...

  8. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

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

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

  10. 桥接模式(Bridge Pattern)

    1,定义           桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...

随机推荐

  1. 关于使用repo时repo init和repo sync失败的一个解决方案

    由于我国的网络的原因,在访问谷歌等一些国外网络资源时经常会遇到被拦截的情况,导致repo等一些代码管理工具拉取代码网络受限受阻,下面提供一个可以参考的简单解决方案. 1.repo init时的遇到fa ...

  2. 03导航链接的制作(wx:for循环)和小程序警告request fail url not in domain list

    06==>导航链接的制作 <!-- 导航链接 --> <navigator url="../list/list" hover-class="nav ...

  3. lf 前后端分离 (5) 优惠券

    关于优惠券 优惠券主要通过前端传回来的course_id_list 创建数据结构 首先清空操作,将所有的优惠券清空, 并将所有优惠劵放到redis中的过程 import datetime import ...

  4. VS调试

    1.调试输出变量值 F9先设置断点,开始调试后,依次选择调试——>窗口——>局部变量和监视——>监视1. 点击“全部中断”——>之后局部变量会显示相关变量值,监视1可以查看变量 ...

  5. Comet 67E: ffort

    题目传送门:Comet 67E. 用了个傻逼做法 A 了这题,欢迎观赏睿智做法! 题意简述: 题目说得很清楚了(这次是我不想写了). 题解: 为了方便,令 \(m\) 为敌人数,\(n\) 为己方士兵 ...

  6. v8 编译 时长3小时

  7. thymeleaf关于js的一些坑

    乍一看,没问题,也许对应用过thymeleaf的小伙伴来说一眼就看出了问题,但是对于新手确实很难发现,thymeleaf会把[[]]中的内容作为内联取值块解析,而不是数组. 解决办法 方法一: < ...

  8. 大宗商品市场的未来王者 | 现货贸易商PK期货风险管理子公司

    https://mp.weixin.qq.com/s/z-kkeIor6vDb9Oer73Ct6w 大宗商品市场卧虎藏龙,参与者众多,然而能称之为王者的却寥寥无几. 在国外,以嘉能可.托克.摩科瑞为代 ...

  9. zz独家专访AI大神贾扬清:我为什么选择加入阿里巴巴?

    独家专访AI大神贾扬清:我为什么选择加入阿里巴巴? Natalie.Cai 拥有的都是侥幸,失去的都是人生 ​关注她 5 人赞同了该文章 本文由 「AI前线」原创,原文链接:独家专访AI大神贾扬清:我 ...

  10. Java链接Oracle

    首先在Navicat里面链接Oracle: 连接时老报错:ORA-12505, TNS:listener does not currently know of SID given in connect ...