桥接模式(Bridge Pattern)
1,定义
桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂度,
桥接模式是连接功能与实现部分的设计模式,其用意在于使功能与实现分离,从而支持多维度的变化。
现实抽象理解:
开关与电灯,开关通过电线连接电灯,进而控制电灯,在这里,电灯可以认为是实现部分,而开关代表功能部分,我们可以独立的更换开关或电灯两者之一,而对另一方没有任何影响, 也就是说每个部分的变化(更换)对另一部分不会造成影响。
2,模式分析
- 将抽象与实现解耦,从而使两者可以相对独立的变化而互不影响;
- 使用聚合关联,不使用继承关联;
- 应对多维度的变化需求;
- 在两种层次间扮演彼此沟通的桥梁,把不同层次区分开来,使两个层次在分别在各之的方向扩展。
3, 使用场合
- 不希望在抽象类和它的实现部分之间有一个固定的绑定关系;
- 类的抽象及实现都应该可以通过生成子类的方法加以扩充;
- 对一个抽象的部分的更改应该对客户端没有任何影响,即客户的代码不必重新编译。
以电灯及开关为例,开关可控制不同的电灯

从上面静态类国可以看出,由实现部分,功能部分及桥梁共同实现桥接模式
实现部分与功能部分可以各自在自己的类层次上扩展,而对其它部分没有任何影响,我们可以通过实现ILight接品添加新的电灯,同样可以通过继承BaseSwitch实现新的开关,所以,实现部分与功能部分可以实现各自的扩展,模式支持多维度的变化
把电灯实例注入开关中,实现功能与实现部分的桥梁作用。
电灯接口:
package com.demo.bridge.lights; /**
* 电灯接口
*
* @author
*
*/
public interface ILight
{
// 接通电流
public void electricConnected(); // 照明
public void light(); // 电流关闭
public void electricClosed(); }
一般开关:
通过此处把电灯实例注入进来,充当功能部分与实现部分的沟通桥梁的作用,调用实现部分实现真正的开灯动作
package com.demo.bridge.switchs; import com.demo.bridge.lights.ILight; /**
* 开关顶层类
*
* @author
*
*/
public class BaseSwitch {
// 使用组合 设置ILight为内部私有属性 此为桥梁
protected ILight light; // 构造方法将 外部的light类型注入进来
public BaseSwitch(ILight light) {
this.light = light;
} /**
* 开灯方法
*/
public final void makeLight() {
// 打开开关 接通电流
this.light.electricConnected();
// 照明
this.light.light();
// 关闭开关 关闭电流
this.light.electricClosed();
}
}
摇控开关:
调用实现部分实现真正的开灯动作,只是在功能上添加颜色,由此可见,我们可以通过添加新的功能类实现新的功能,而对实现部分没有任何影响。
package com.demo.bridge.switchs.sub; import com.demo.bridge.lights.ILight;
import com.demo.bridge.switchs.BaseSwitch; /**
* 遥控开关 继承BaseSwitch 扩展功能
*
* @author
*
*/
public class RemoteControlSwitch extends BaseSwitch
{
// 构造方法
public RemoteControlSwitch(ILight light)
{
super(light);
} /**
* 使用遥控开关控制开灯
*
* @param operColor
* 灯颜色
*/
public final void makeRemoteLight(int operColor)
{
// 打开开关 接通电流
this.light.electricConnected();
// 照明
this.light.light();
String color = "";
switch (operColor)
{
case 1:
color = "暖色";
break;
case 2:
color = "蓝色";
break;
case 3:
color = "红色";
break;
default:
color = "白色";
break;
}
System.out.println(" ...现在是" + color + "!"); // 关闭开关 关闭电流
this.light.electricClosed();
}
}
白炽灯实现:
package com.demo.bridge.lights.impl; import com.demo.bridge.lights.ILight; /**
* 白炽灯 实现
*
* @author
*
*/
public class IncandescentLight implements ILight
{
// 电流关闭
public void electricClosed()
{
System.out.println("白炽灯被关闭了..."); } // 接通电流
public void electricConnected()
{
System.out.println("白炽灯被打开了...");
} // 照明
public void light()
{
System.out.println("白炽灯照明!"); } }
水晶灯实现:
package com.demo.bridge.lights.impl; import com.demo.bridge.lights.ILight; /**
* 水晶灯 实现
*
* @author
*
*/
public class CrystalLight implements ILight
{
// 电流关闭
public void electricClosed()
{
System.out.println("水晶灯被关闭了..."); } // 接通电流
public void electricConnected()
{
System.out.println("水晶灯被打开了..."); } // 照明
public void light()
{
System.out.println("水晶灯照明!"); } }
客户程序:
我们也可以让一般开发控制水晶灯,只需把水晶灯实例注入到一般开关中
package com.demo; import com.demo.bridge.lights.ILight;
import com.demo.bridge.lights.impl.CrystalLight;
import com.demo.bridge.lights.impl.IncandescentLight;
import com.demo.bridge.switchs.BaseSwitch;
import com.demo.bridge.switchs.sub.RemoteControlSwitch; /**
* 客户端应用程序
*
* @author
*
*/
public class ClientForBridge { /**
* @param args
*/
public static void main(String[] args) {
// 白炽灯 实例
ILight incandescentLight = new IncandescentLight();
// 水晶灯 实例
ILight crystalLight = new CrystalLight(); // 一般开关
System.out.println("-- 一般开关 -- ");
BaseSwitch switch1 = new BaseSwitch(incandescentLight);
switch1.makeLight();
System.out.println("\n-- 遥控开关 -- ");
// 遥控开关
RemoteControlSwitch remoteControlSwitch = new RemoteControlSwitch(
crystalLight);
remoteControlSwitch.makeRemoteLight(1);
}
}
运行结果:

桥接模式(Bridge Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
- 转:设计模式-----桥接模式(Bridge Pattern)
转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...
- 七个结构模式之桥接模式(Bridge Pattern)
问题: 当存在多个独立的变化维度时,如果仍采用多层继承结构,会急剧的增加类的个数,因此可以考虑将各个维度分类,使他们不相互影响. 定义: 将抽象部分与它的实现部分进行分离,抽象部分只保留最为本质的部分 ...
- C#设计模式——桥接模式(Bridge Pattern)
一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...
- php桥接模式(bridge pattern)
有点通了 <?php /* The bridge pattern is used when we want to decouple a class or abstraction from its ...
随机推荐
- 返璞归真vc++之字符类型
在今天,大量使用java与.net的程序员已经很少去真实了解字符的底层表达,但是使用VC++编程,对字符的处理却非常慎重,刚学习vc++肯定会为其中的字符类型给晕头转向,今天本人学习第一节,从字符开始 ...
- 过滤字段中HTML标签
代码中只是过滤了一部分标签,例如span这些还是没有过滤,如果有更好办法的,可以帮忙补充 create FUNCTION [dbo].[CleanHTML] (@HTMLText VARCHAR(MA ...
- ubuntu bash提示找不到文件或目录
我在ubuntu上安装好后交叉编译器,用tab键也可以找到这个交叉编译器,但执行的时候总是提示:bash:xxx找不到文件或目录. 解决方法:安装lib32z1 命令:apt-get install ...
- WCF 服务的ABC之契约(七)
契约 Contract WCF的所有服务都会公开为契约(Contract),契约与平台无关,是描述服务功能的标注方式. 服务契约(Service Contract) 服务契约描述的是一个服务,它定义了 ...
- CSS各个浏览器Hack的写法
Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack.然后将Hack ...
- How to check Windows 7 OS is permanently activated?[Windows 7]
Press Windows + R, then you can enter : slmgr.vbs -xpr
- c# HttpWebRequest与HttpWebResponse(转)
如果你想做一些,抓取,或者是自动获取的功能,那么就跟我一起来学习一下Http请求吧.本文章会对Http请求时的Get和Post方式进行详细的说明,在请求时的参数怎么发送,怎么带Cookie,怎么设置证 ...
- 【ajax跨域】原因原理解决
1.安全,跨域cookie iframe 2.很简单,就是利用<script>标签没有跨域限制的“漏洞”(历史遗迹啊)来达到与第三方通讯的目的.当需要通讯时,本站脚本创建一个<scr ...
- 查看MYSQL数据库中所有用户及拥有权限
查看MYSQL数据库中所有用户 mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM m ...
- Pomodairo,番茄工作法-解刨篇
处于“信息大爆炸”的 e 时代的我们每天必定要处理很多的事情,不管是工作.学习.生活......面对这么多的纷杂的事物我们将如何应对?如何做到有条不紊的进行?高效.轻松.愉快的完成它呢?这时一款精致的 ...