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

  举个例子,我们都知道,汽车有不同的发动机,有油的,有电的,还有用天然气的

  我们先举两个不采用桥接模式的例子,通过对比,来看出桥接模式的优势

  第一个:

  先新建一个接口Car,所有车都实现这个接口,这个接口中有一个公共的方法installEngine()安装发动机

 /*
* 汽车
*/
public interface Car {
//安装引擎
public void installEngine();
}

  然后,不同的车,比如公交,suv,轿车,都有不同的发动机,所以先新建不同的车,实现Car接口,因为不同种类的车下面还有不同的发动机,所以将具体的车建为抽象类,将其中实现Car的方法也抽象化。

  公交

 /*
* 公交车
*/
public abstract class Bus implements Car{ @Override
public abstract void installEngine();
}

  SUV

 /*
* SUV
*/
public abstract class Suv implements Car{ @Override
public abstract void installEngine();
}

  不同的车有不同的发动机,每种车的不同发动机都是一个子类

 public class OilBus extends Bus{
@Override
public void installEngine() {
System.out.println("给公交安装燃油发动机");
}
}
 public class ElectricityBus extends Bus{
@Override
public void installEngine() {
System.out.println("给公交安装电动发动机");
}
}
 public class OilSuv extends Suv{
@Override
public void installEngine() {
System.out.println("给SUV安装燃油发动机");
}
}
 public class ElectricitySuv extends Suv{
@Override
public void installEngine() {
System.out.println("给SUV安装电动发动机");
}
}

  运行客户端

 public class MainClass {
public static void main(String[] args) {
Car car = new OilBus();
car.installEngine();
}
}

  可以看到这样的结果

  但是这样有个很大的弊端

  可以看到,一种车每增加一种发动机就要增加一个子类,到了后期,子类会越来越多,越来越庞大。这种方法不推荐使用。

  第二个例子:

  把所有的发动机都定义到Car接口中,每种车实现一次就好了

  Car

 /*
* 汽车
*/
public interface Car {
//安装燃油引擎
public void installOilEngine();
//安装电动引擎
public void installElectricityEngine();
}

  Bus

 /*
* 公交车
*/
public class Bus implements Car{
@Override
public void installOilEngine() {
System.out.println("给公交安装燃油发动机");
} @Override
public void installElectricityEngine() {
System.out.println("给公交安装电动发动机");
}
}

  Suv

 /*
* SUV
*/
public class Suv implements Car{
@Override
public void installOilEngine() {
System.out.println("给SUV安装燃油发动机");
} @Override
public void installElectricityEngine() {
System.out.println("给SUV安装电动发动机");
}
}

  客户端

public class MainClass {
public static void main(String[] args) {
Car bus = new Bus();
Car suv = new Suv(); bus.installOilEngine();
bus.installElectricityEngine(); suv.installOilEngine();
suv.installElectricityEngine();
}
}

  运行结果

  这种方式就没有那么多子类了,每种车只有一个实现类,但是这种方法不符合我们的开放封闭原则,每增加一种发动机,就要修改Car接口,并修改所有实现类。这种方法肯定也是不推荐的。

  接下来,就要说到桥接模式了。

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

  把抽象与行为实现分开,保证各部分的独立性,所以我们可以把车和发动机分离开来,保证他们各自的独立性。

  

  增加一种车,对发动机没有影响,增加发动机吧对车也没有影响,Car接口中有对Engine的引用,也就是Car体系与Engine体系之间的桥梁。

  

  

  桥接模式的角色和职责

  1、Client:Bridge模式的使用者

  2、Abstraction(Car)

      (1)抽象类接口(接口或抽象类)

  (2)维护对行为实现(Implementor)的引用

  3、Refined Abstraction(Bus、Suv):Abstraction子类

  4、Implementor(Engine): 行为实现类接口 (Abstraction接口定义了基于Implementor接口的更高层次的操作)

  5、ConcreteImplementor(OilEngine、ElectricityEngine):Implementor子类

  接下来,用代码实现:

  首先,新建发动机体系

 /*
* 发动机
*/
public interface Engine {
public void installEngine();
}
 /*
* 燃油发动机
*/
public class OilEngine implements Engine{
@Override
public void installEngine() {
System.out.println("安装燃油发动机");
}
}
 /*
* 电动发动机
*/
public class ElectricityEngine implements Engine{
@Override
public void installEngine() {
System.out.println("安装电动发动机");
}
}

  新建Car体系

 /*
* 汽车
*/
public abstract class Car {
private Engine engine; public Car(Engine engine){
this.engine = engine;
} //安装发动机
public abstract void installEngine(); public Engine getEngine() {
return engine;
} public void setEngine(Engine engine) {
this.engine = engine;
}
}
 /*
* 公交车
*/
public class Bus extends Car{ public Bus(Engine engine) {
super(engine);
} @Override
public void installEngine() {
System.out.print("公交:");
this.getEngine().installEngine();
}
}
 /*
* SUV
*/
public class Suv extends Car{
public Suv(Engine engine) {
super(engine);
} @Override
public void installEngine() {
System.out.print("SUV:");
this.getEngine().installEngine();
}
}

  最后,新建客户端调用

 public class MainClass {
public static void main(String[] args) {
Engine oilEngine = new OilEngine();
Engine electricityEngine = new ElectricityEngine(); Car oilBus = new Bus(oilEngine);
Car electricityBus = new Bus(electricityEngine); Car oilSuv = new Suv(oilEngine);
Car electricitySuv = new Suv(electricityEngine); oilBus.installEngine();
electricityBus.installEngine(); oilSuv.installEngine();
electricitySuv.installEngine();
}
}

  结果如下

  可以看到,这样子的话,新建这的种类,丝毫不影响发动机,新建一种发动机,也不影响车,这就是一个简单的桥接模式的例子

  总结:

  1.桥接模式的优点

  (1)实现了抽象和实现部分的分离

  桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。

  (2)更好的可扩展性

  由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。

  (3)可动态的切换实现

  由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。

  (4)实现细节对客户端透明,可以对用户隐藏实现细节。

  2.桥接模式的缺点

  (1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

  (2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。

  3.桥接模式的使用场景

  (1)如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

  (2)抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。

  (3)一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

  (4)虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

  (5)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用

java设计模式-----14、桥接模式的更多相关文章

  1. java设计模式7——桥接模式

    java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...

  2. java设计模式之桥接模式

    桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的 ...

  3. Java设计模式:桥接模式

    问题提出 生活中有很多事物集合,设为A1,A2......Am ,而每个事物都有功能F1,F2....Fn. 例如邮局的发送业务.简单模拟有两类事物:信件和包裹,均有平邮和挂号邮寄功能.程序设计中如何 ...

  4. 再起航,我的学习笔记之JavaScript设计模式14(桥接模式)

    桥接模式 桥接模式(Bridge): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...

  5. Java设计模式应用——桥接模式

    性能管理系统中,数据产生后需要经过采集,汇聚,入库三个流程,用户才能查询使用. 采集可以是snmp采集,也可以是ems采集:汇聚可以使storm汇聚,也可以是spark汇聚:入库可以是hdfs入库,也 ...

  6. java设计模式之-----桥接模式

    一.概念定义 将抽象部分和实现部分分离,使他们都可以独立的变化.(这句话有点抽象啊..) 在软件系统中,某种类型由于自身逻辑,具有多个维度的变化,如何利用面向对象的技术来使得该类型沿着多方向变化,而又 ...

  7. JAVA设计模式之桥接模式(bridge)

    桥接模式: 分离抽象与具体实现,让他们可以独自发展,防止类爆炸 场景: 过年走亲戚是我们中国人传统的习俗,走亲戚那就少不了要买东西(苹果,牛奶等等),这些具体的东西就是具体的类 蒙牛牛奶,有机苹果,有 ...

  8. 八戒转世投胎竟然是Java设计模式:桥接模式

    目录 示例 代码实例 桥接模式 定义 意图 主要解决问题 何时使用 优缺点 八戒转世投胎的故事 示例 请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思 想设计图形 分析: 1.比如有 ...

  9. java面试题之----jdbc中使用的设计模式(桥接模式)

    1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...

  10. java设计模式3--单例模式(Singleton)

    本文地址:http://www.cnblogs.com/archimedes/p/java-singleton-pattern.html,转载请注明源地址. 单例模式 保证一个类仅有一个实例,并提供一 ...

随机推荐

  1. C/C++语言简介之运算符

    比较特别的是,比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补 0)位移.例如,将 11100011 右移 3 比特,算术右移后成为 11111100,逻辑右移则为 0 ...

  2. POJ - 1321 dfs [kuangbin带你飞]专题一

    枚举行和列即可,当前已经放下cnt个棋子,当前已经搜索到第r行,如果 n - r + cnt  < k 直接退出,因为后面无法放下剩下的棋子. AC代码 #include<cstdio&g ...

  3. 【BZOJ1565】 植物大战僵尸

    Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...

  4. HTTP协议报文结构及示例

    HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. 9.png Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请 ...

  5. java调用shell脚本,并获得结果集的例子

    /** * 运行shell脚本 * @param shell 需要运行的shell脚本 */ public static void execShell(String shell){ try { Run ...

  6. 借鉴mini2440的usb-wifi工具集在Beagleboard上移植无线网卡

    配置minicom: sudo yum install minicom sudo minicom -s 选择Serial port setup,此时所示光标在"Change which se ...

  7. linux redis基础应用 主从服务器配置

    Redis基础应用 redis是一个开源的可基于内存可持久化的日志型,key-value数据库redis的存储分为内存存储,磁盘存储和log文件三部分配置文件中有三个参数对其进行配置 优势:和memc ...

  8. 搜索引擎的缓存(cache)机制

    什么是缓存? 在搜索领域中,所谓缓存,就是在高速内存硬件设备上为搜索引擎开辟一块存储区,来存储常见的用户查询及其结果,并采用一定的管理策略来维护缓存区内的数据.当搜索引擎再次接收到用户的查询请求时,首 ...

  9. WIN7下PS/2等键盘失灵无法使用的解决办法

    WIN7下PS/2等键盘失灵无法使用的解决办法 装了win7,无意中一天开机,发现键盘不能用了.开始以为键盘坏了,重启看机,一看能进bios,各键正常.然后再重启,进系统,看设备管理器,发现键盘为黄色 ...

  10. VS2005 添加lib 的方法

    应用程序使用外部库时需要进行加载,两种库的加载本质上都是一样:提供功能和功能的定义.vs2005 c++ 项目设置外部库方法如下:1. 添加编译所需要(依赖)的 lib 文件     在"项 ...