1.概述:

桥接模式:把抽象和行为分离开来,中间需要某个介质来连接抽象化和行为化。此模式的概述听起来非常像适配器模式,不要搞混了,虽然都是借用中间介质,但意义不同。最典型的桥接模式就是:JDBC。通过Connection来与不同的数据库进行连接,然后用DriverManager来管理。

2.例子:

我们哪车子来打比方,比如:车有很多中类型(Bus,Jeep,taxi等),但每个车的引擎又不一样(有2000cc,2200cc)的;现在我们来造车,平常思维是根据车的配置来安装不同的引擎,而我们桥接模式的思维却是根据引擎来造车。

平常思维一:

/**
*造一个安装了引擎的车类接口
*/
package com.msit.xxx; public interface Car {
public void installEngine();// 安装 引擎
}
 /**
*造一个Bus的具体车类,但每种Bus的引擎我们是不能立即确定的
*/ package com.msit.xxx; /**
* 公交车:需要哪种引擎就要增加哪种子类
*
* @author admin
*
*/
public abstract class Bus implements Car { @Override
public abstract void installEngine();// 公交车又有2000cc发动机和2200cc发动机 }
 package com.msit.xxx;
/**
*造一辆2000cc的Bus
*/
public class Bus2000 extends Bus { @Override
public void installEngine() {
System.err.println("这是2000cc发动机Bus");
}
}
/**
*造一辆2200cc的Bus
*/
package com.msit.xxx; public class Bus2200 extends Bus { @Override
public void installEngine() {
System.out.println("这是2200cc发动机Bus");
} }
package com.msit.xxx;

public class MainClass {
public static void main(String[] args) {
/**
* 生产一辆2000cc的Bus
*/
Car car1 = new Bus2000();
car1.installEngine(); }
}

这种实现方式的不足就是:每当我们的引擎或车的类型不确定时,或者增加(加一个1800cc的)引擎和车(造一辆吉普车)时,我们都需要写一个类实现Car,然后再继承具体车型;这样就会造成非常多的子类,显得项目非常的复杂。

平常思维二:

package com.msit.xxx2;
/**
*我们在造车的时候一并把引擎造出来,这样当某个车型需要哪种引擎就引用这种引擎
*/
public interface Car {
// public void installEngine();原来的方法,产生一个总的引擎
public void install2000Engine(); public void install2200Engine();
......其他引擎
}
package com.msit.xxx2;

public class Bus implements Car {
/**
* 造汽车时,把引擎造出来
*/
@Override
public void install2000Engine() {
System.out.println("2000cc发动机Bus");
} @Override
public void install2200Engine() {
System.out.println("2200发动机Bus");
} }
package com.msit.xxx2;
/**
*生产汽车
*/
public class MainClass {
public static void main(String[] args) {
Car car = new Bus();
car.install2000Engine();// 需要哪种引擎公交车就装哪种
}
}

这种实现的特点就是:把子类具有的引擎集中在一起 ,需要哪种子类就增加哪种子类方法。但缺点时,有些引擎我们用不到却造出来了,这些方法就会变成一些冗余代码。

下面我们来用桥接模式做一下:

package com.msit.Birdge;

/**
* 总引擎 桥接模式:以前是根据汽车来分引擎,现在是根据引擎来分汽车
*
* @author admin
*
*/
public interface Engine {
public void installEngine(); }
package com.msit.Birdge;
/**
*造一个具体的引擎
*/
public class Engine2000 implements Engine { @Override
public void installEngine() {
System.out.println("2000cc");
}
}
package com.msit.Birdge;

public class Engine2200 implements Engine {

    @Override
public void installEngine() {
System.out.println("2200cc");
} }
package com.msit.Birdge;

/**
* 设为抽象类的目的,根据不同车来配置引擎
*
* @author admin
*
*/
public abstract class Car {
private Engine engine;// 调用总引擎 public Car(Engine engine) {
this.engine = engine;
} public Engine getEngine() {
return engine;
} public void setEngine(Engine engine) {
this.engine = engine;
} public abstract void installEngine();
}
package com.msit.Birdge;
/**
*开始设计车
*/
public class Bus extends Car { public Bus(Engine engine) {
super(engine);
} @Override
public void installEngine() {
System.out.println("Bus:");
this.getEngine().installEngine();// 调用发动机,具体哪种发动机再安装的时候说明(使用Main方法的时候)
} }
package com.msit.Birdge;

/**
* 开始生产
*
* @author admin
*
*/
public class MainClass {
public static void main(String[] args) {
// 1.做一个具体的发动机出来
Engine engine2000 = new Engine2000();
Engine engine2200 = new Engine2200();
// 2.做一个具体的车出来,并把具体引擎安上
Car car = new Bus(engine2000);
car.installEngine(); Car car2 = new Bus(engine2200);
car2.installEngine(); // 想造什么类型的车并配上什么类型的引擎就直接new出来,不用产生那么多子类了。想做什么发动机就再做个
}
}

桥接模式:把所有模子都做出来,在构造器上进行安装具体哪种模子,此时构造器就相当于一个桥接介质, 把抽象和行为分开了。

减少了子类和代码量,比如当我想再增加一个Jeep车时,就不需要增加那么多子类文件(引擎),而是安装一个总的Jeep车,再对引擎进行桥接。只需在main方法中这样写:

public class MainClass {
public static void main(String[] args) { Car jeepCar = new Jeep(engine2000);
jeepCar.installEngine(); Car jeepCar2 = new Jeep(engine2200);
jeepCar2.installEngine();
}
}

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

  1. Java设计模式---桥接Bridge模式

    参考于 : 大话设计模式 马士兵设计模式视频 写在开头: 桥接模式主要用于一件事物分成了两个维度,进行排列组合,比如礼物,可以分成优雅的礼物(抽象),花(具体),排列组合优雅的花! 1.为什么使用桥接 ...

  2. 设计模式初探-桥接(Bridge)模式

    桥接(Bridge)模式,又称Handle/Body模式,属于对象结构型模式.用于将抽象部分与它的实现部分分离,使它们都可以独立地变化.比如常见的电脑窗口界面,不同的操作系统其窗口界面绘制的原理肯定不 ...

  3. Java 实现桥接(Bridge)模式

    类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamp3d21scDQ1Ng==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  4. 【设计模式】Bridge模式(桥接模式)

    最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...

  5. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

  6. 设计模式之——bridge模式

    Bridge模式,又叫桥接模式,是针对同一接口进行扩展与实现操作的一种设计模式. 这种模式,与之前学过的适配器模式具有相似的地方,也有不同的地方,下面就让我们一一解析吧. 首先,我们要了解到,为什么需 ...

  7. 漫谈设计模式(三):桥接(Bridge)模式 —— 将类功能、结构两层次分离

    1.前言 类主要有两个层次,一个是功能层次,另一个是实现层次. 功能层次,一般应用于当前类不能满足多样化的业务需求,让子类去继承(具体)父类,添加加一些父类中没有的功能(一般是增加新的方法),这就属于 ...

  8. Objective-C设计模式——桥接Bridge(接口适配)

    桥接模式 桥接模式就是让抽象和实现分离的最好体现,符合面向对象的依赖倒转原则.Abstruct抽象类负责设计客户端接口,Implementor则负责具体的细节逻辑. 在桥接模式中,Abstruct类持 ...

  9. 桥接(Bridge)模式

    桥接模式又称为柄体模式或接口模式.桥接模式的用意就是"将抽象化与实现化解耦,使得二者可以独立变化". 抽象化: 存在于多个实体中的共同的概念性联系,就是抽象化.作为一个过程,抽象化 ...

随机推荐

  1. play framework接收post请求json格式的参数

    大家在用play framework框架开发第三方调用你的接口的时候并且用json格式的参数post请求 ,参数接收是个问题 ,因为play对表单提交post请求有处理: 有两种方法: 1.直接形参列 ...

  2. 【BZOJ1578】【USACO2009Feb】股票市场 背包DP

    题目大意 告诉你\(n\)只股票在这\(m\)天内的价格,给你\(s\)元的初始资金,问你\(m\)天后你最多拥有多少钱. \(n\leq 50,m\leq 10,s\leq 200000,\)答案\ ...

  3. 【XSY1602】安全网络 树形DP 数学

    题目大意 有一颗树,要为每个节点赋一个值\(l_i\leq a_i\leq r_i\),使得任意相邻的节点互素.然后对每个节点统计\(a_i\)在所有可能的情况中的和. \(n\leq 50,1\le ...

  4. ionic更改端口号

    —— 重新指定端口号为8888 serve [options] ............................... 启动本地服务器进行开发测试 dev/testing [--console ...

  5. 前后端分离之vue2.0+webpack2 实战项目 -- html模板拼接

    对于前后端分离,如何把一个页面的公共部分比如head, header, footer, content等组合成一个完整的html 是一个值得考虑的地方. 对于php,我们可以利用include加载其他 ...

  6. 24 Zabbix系统配置日志监控告警--关键字触发

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 24 Zabbix系统配置日志监控告警--关键字触发 trapper是被监控主机主动发送数据给za ...

  7. emwin之2D图形流位图显示的方法

    @2018-10-31 [需求] 界面上绘制状态指示图标 [方法] --① 方法一 外部存储介质上的图标读写与显示 i  . 将要显示的图标使用官方软件<BmpCvt.exe>转换成 &q ...

  8. JSOI2014骑士游戏(最短路)

    题目背景 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. 题目描述 在这个游戏中,JYY一共有两种攻击方式,一种是普通 ...

  9. 存在重复元素 II

    题目描述 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. 示例 1: 输入: n ...

  10. hdu 5289 Assignment (ST+二分)

    Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro ...