1.意图

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

2.适用性

  • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
  • 类的抽象与它的实现都应该可以通过子类的方式加以扩展。
  • 抽象部分与实现部分可以独立变化,而不会相互影响。
  • 从多维度扩展应用程序。

3.结构

4.参与者

  • Abstraction: 定义抽象的接口;维护一个指向Implementor对象的引用。
  • RefinedAbstraction: 扩充有Abstracttion定义的接口。
  • Implementor: 定义实现类的接口,该接口不一定要与Abstraction接口完全一致,事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
  • ConcreteImplementor: 实现Implementor接口并定义它具体实现。

5.效果

1) 分离接口及其实现部分。
2) 提供可扩展性。
3) 实现细节对客户透明。

6.实例

1)场景

在消息发送的场景中,消息类型抽象为普通消息和紧急消息,发送实现方式为邮件和短信。使用桥接模式,既可以在消息类型的维度上增加各种类型抽象,也可以在发送方式维度上增加各种实现方式。两者独立变化,实现解耦的效果。

2)UML图

3)代码

AbstractMessage抽象类

  1. public abstract class AbstractMessage {
  2. protected ISendMethod sm;
  3. public AbstractMessage(ISendMethod sm) {
  4. super();
  5. this.sm = sm;
  6. }
  7. public void sendMessage(String str){
  8. this.sm.send(str);
  9. }
  10. }

CommonMessage类

  1. public class CommonMessage extends AbstractMessage{
  2. public CommonMessage(ISendMethod sm) {
  3. super(sm);
  4. // TODO Auto-generated constructor stub
  5. }
  6. @Override
  7. public void sendMessage(String str) {
  8. // TODO Auto-generated method stub
  9. super.sendMessage(str);
  10. }
  11. }

UrgentMessage类

  1. public class UrgentMessage extends AbstractMessage{
  2. public UrgentMessage(ISendMethod sm) {
  3. super(sm);
  4. // TODO Auto-generated constructor stub
  5. }
  6. @Override
  7. public void sendMessage(String str) {
  8. // TODO Auto-generated method stub
  9. str += "(Urgent!!!)";
  10. this.sm.send(str);
  11. }
  12. }

ISendMethod接口

  1. public interface ISendMethod {
  2. public void send(String str);
  3. }

SendEmail类

  1. public class SendEmail implements ISendMethod {
  2. @Override
  3. public void send(String str) {
  4. // TODO Auto-generated method stub
  5. System.out.println("This is a email message:"+ str);
  6. }
  7. }

SendSms类

  1. public class SendSms implements ISendMethod {
  2. @Override
  3. public void send(String str) {
  4. // TODO Auto-generated method stub
  5. System.out.print("This a sms message:" + str);
  6. }
  7. }

Main测试类

  1. public class Main {
  2. public static void main(String[] args){
  3. ISendMethod sender = new SendEmail();
  4. AbstractMessage aMessage = new UrgentMessage(sender);
  5. aMessage.sendMessage("Test");
  6. ISendMethod sender2 = new SendSms();
  7. AbstractMessage aMessage2 = new CommonMessage(sender2);
  8. aMessage2.sendMessage("Test2");
  9. }
  10. }

输出结果

This is a email message:Test(Urgent!!!)
This a sms message:Test2

附件列表

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

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

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

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

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

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

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

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

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

  5. [设计模式] 7 桥接模式 bridge

    #include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...

  6. 设计模式 笔记 桥接模式 Bridge

    //---------------------------15/04/15---------------------------- //Bridge 桥接模式----对象结构型模式 /* 1:意图:将 ...

  7. 设计模式之桥接模式(Bridge)

    桥接模式与原理:将抽象部分与实现部分分离,使它们都可以独立的变化.最终的结果表现在实现类中.两者之间属于等价关系,即实现部分和抽象部分可以相互交换. 代码如下 #include <iostrea ...

  8. 结构型设计模式之桥接模式(Bridge)

    结构 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. ...

  9. 【设计模式】—— 桥接模式Bridge

    前言:[模式总览]——————————by xingoo 模式意图 这个模式使用的并不多,但是思想确实很普遍.就是要分离抽象部分与实现部分. 实现弱关联,即在运行时才产生依赖关系. 降低代码之间的耦合 ...

随机推荐

  1. POJ 2112 Optimal Milking (二分 + 最大流)

    题目大意: 在一个农场里面,有k个挤奶机,编号分别是 1..k,有c头奶牛,编号分别是k+1 .. k+c,每个挤奶机一天最让可以挤m头奶牛的奶,奶牛和挤奶机之间用邻接矩阵给出距离.求让所有奶牛都挤到 ...

  2. build opencv with python support

    cmake -DPYTHON_LIBRARY=/opt/anaconda/lib/libpython2.7.so -DPYTHON_INCLUDE_DIR=/opt/anaconda/include/ ...

  3. 【Lucene4.8教程之五】Luke

    一.Luke基本内容 1.Luke简介 Luke可用于查看Lucene创建的索引,并对其进行基本操作. 2.创建Luke (1)从Github上下载源文件 https://github.com/tar ...

  4. php-app开发接口加密

    自己平时工作中用到的一套接口加密规则,记录下来以后用: /** 2 inc 3 解析接口 客户端接口传输规则: 1.用cmd参数(base64)来动态调用不同的接口,接口地址统一为 http://a. ...

  5. information_schema.triggers 学习

    mysql实例中的每一个trigger 对应到information_schema.triggers 中有一行 1.information_schema.triggers 表的常用列: 1.trigg ...

  6. 使用ARM模板部署自动扩展的Linux VMSS(2)

    12.准备完了模板文件,我们使用Powershell来创建VMSS for Linux的自动扩展集合,首先登陆到Azure中国的ARM账号: Login-AzureRmAccount -Environ ...

  7. mysql索引分类及注意事项

    MYSQL索引主要分为四类:主键索引,普通索引(聚合,非聚合),唯一索引,全文索引 全文索引,主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用. 索引的原理:利用二叉树(哈希表 ...

  8. javascript调试

    今天,发现了一个之前从未注意的角落,相信能够大大提高自己写JS的速度.能够迅速发现错误. 例如,今天的加班中调试一个js错误发现的一个例子. 1.Google浏览器报的错 以上是google浏览器报的 ...

  9. Linux系统编程(6)——文件系统

    计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数 ...

  10. 百度地图JavaScript API V1.5初级开发工具类

    /** * 百度地图使用工具类-v1.5 * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email boo ...