设计模式之桥接模式(Bridge)--结构模型
1.意图
将抽象部分与它的实现部分分离,使它们可以独立地变化.
2.适用性
- 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
- 类的抽象与它的实现都应该可以通过子类的方式加以扩展。
- 抽象部分与实现部分可以独立变化,而不会相互影响。
- 从多维度扩展应用程序。
3.结构

4.参与者
- Abstraction: 定义抽象的接口;维护一个指向Implementor对象的引用。
- RefinedAbstraction: 扩充有Abstracttion定义的接口。
- Implementor: 定义实现类的接口,该接口不一定要与Abstraction接口完全一致,事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
- ConcreteImplementor: 实现Implementor接口并定义它具体实现。
5.效果
1) 分离接口及其实现部分。
2) 提供可扩展性。
3) 实现细节对客户透明。
6.实例
1)场景
在消息发送的场景中,消息类型抽象为普通消息和紧急消息,发送实现方式为邮件和短信。使用桥接模式,既可以在消息类型的维度上增加各种类型抽象,也可以在发送方式维度上增加各种实现方式。两者独立变化,实现解耦的效果。
2)UML图

3)代码
AbstractMessage抽象类
public abstract class AbstractMessage {protected ISendMethod sm;public AbstractMessage(ISendMethod sm) {super();this.sm = sm;}public void sendMessage(String str){this.sm.send(str);}}
CommonMessage类
public class CommonMessage extends AbstractMessage{public CommonMessage(ISendMethod sm) {super(sm);// TODO Auto-generated constructor stub}@Overridepublic void sendMessage(String str) {// TODO Auto-generated method stubsuper.sendMessage(str);}}
UrgentMessage类
public class UrgentMessage extends AbstractMessage{public UrgentMessage(ISendMethod sm) {super(sm);// TODO Auto-generated constructor stub}@Overridepublic void sendMessage(String str) {// TODO Auto-generated method stubstr += "(Urgent!!!)";this.sm.send(str);}}
ISendMethod接口
public interface ISendMethod {public void send(String str);}
SendEmail类
public class SendEmail implements ISendMethod {@Overridepublic void send(String str) {// TODO Auto-generated method stubSystem.out.println("This is a email message:"+ str);}}
SendSms类
public class SendSms implements ISendMethod {@Overridepublic void send(String str) {// TODO Auto-generated method stubSystem.out.print("This a sms message:" + str);}}
Main测试类
public class Main {public static void main(String[] args){ISendMethod sender = new SendEmail();AbstractMessage aMessage = new UrgentMessage(sender);aMessage.sendMessage("Test");ISendMethod sender2 = new SendSms();AbstractMessage aMessage2 = new CommonMessage(sender2);aMessage2.sendMessage("Test2");}}
输出结果
This is a email message:Test(Urgent!!!)
This a sms message:Test2
附件列表
设计模式之桥接模式(Bridge)--结构模型的更多相关文章
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- [设计模式] 7 桥接模式 bridge
#include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...
- 设计模式 笔记 桥接模式 Bridge
//---------------------------15/04/15---------------------------- //Bridge 桥接模式----对象结构型模式 /* 1:意图:将 ...
- 设计模式之桥接模式(Bridge)
桥接模式与原理:将抽象部分与实现部分分离,使它们都可以独立的变化.最终的结果表现在实现类中.两者之间属于等价关系,即实现部分和抽象部分可以相互交换. 代码如下 #include <iostrea ...
- 结构型设计模式之桥接模式(Bridge)
结构 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. ...
- 【设计模式】—— 桥接模式Bridge
前言:[模式总览]——————————by xingoo 模式意图 这个模式使用的并不多,但是思想确实很普遍.就是要分离抽象部分与实现部分. 实现弱关联,即在运行时才产生依赖关系. 降低代码之间的耦合 ...
随机推荐
- vb.net中存储过程的使用
在机房收费系统过程中,试着使用了存储过程,离之前数据库的学习已经有些日子了.之前对于存储过程的了解也是听过而已,非常不清楚.因此,写这篇博客! 专业概念:存储过程是一个SQL语句和控制结构的集合,创建 ...
- No1_2. 流程控制_java学习笔记
import java.util.Scanner; import java.lang.Math; public class HelloForWhile { /** * 文档注释,程序名称:HelloF ...
- JOSN的stringify()和parse()方法
JOSN的stringify()和parse()方法使用,stringify()把对象序列化,parse()把JSON字符串解析为js对象 <script> var book = { ti ...
- jquery插件编写
/*(function($) { $.fn.accordion = function(options) { var settings = $.extend({}, {open: false}, opt ...
- 写jQuery插件时,一种更好的合并参数的方法
看到很多人写jQuery插件时居然这样合并参数: this.defaults = { 'color': 'red', 'fontSize': '12px', 'textDecoration':'non ...
- 高手总结的CSS执行顺序及其优先权问题汇总
今天在看一本书时又看到了”CSS优 先权“这个问题,感觉这个问题还是比较重要的,也算是样式的特异性吧,尤其是在面对较多.较深层.较复杂的样式属性时,理解CSS的加权计算方法对于重写 样式属性之类的问题 ...
- ZendFramework2 源码分析 init_autoloader.php
// Composer autoloading if (file_exists('vendor/autoload.php')) { // 加载自动加载器 $loader = include 'vend ...
- thinkphp使用模块/控制器/操作访问时出现No input file specified.解决方式
thinkphp使用 http://serverName/index.php/模块/控制器/操作 访问时,出现了 No input file specified. 的错误 解决办法: 一: 开启cgi ...
- 《Python基础篇》之初识Python一
Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- python随机产生4个互不相等的随机数
从0-9中随机产生4个互不相等的数, 方法一: import random s=[] while(len(s)<4): x=random.randint(0,9) if x not in s: ...