Abstraction:抽象部分的父类,定义须要实现的接口。维护对实现部分的引用,从而把实现桥接到Implementor中去

Implementor:实现部分的接口

RefinedAbstraction:扩展抽象部分的接口

ConcreteImplementorA/B:真正实现Implementor接口的对象

//桥接模式定义:将抽象部分与它的实现部分分离,使得他们都能够独立地变化。抽象部分仅仅定义出须要实现什么方法(非抽象方法),相当于仅仅给出一个方法的接口。接口中去调用桥接过来的详细实现类去实现,从而实现灵活的扩展性
//广义来讲。桥接模式很普遍。面向抽象编程,面向接口编程就能够看作是他的体现
//实例:一个系统,要依照不同的要求发信息(普通,加急,特急),并且还要以不同的方式发送(站内信,Email。短信)等。考虑到其扩展性,用桥接模式再合适只是了
//上代码
//桥接的一半---抽象部分
public abstract class AbstractionMessage {
protected MessageImplementor impl;
public AbstractMessage(MessageImplementor impl) {
this.impl = impl;
}
public void sendMessage(String message, String toUser) {
this.impl.send(message, toUser);
}
}
//发送消息的统一接口。即桥接的还有一半---实现的接口
public interface MessageImplementor {
public void send(String message, String toUser);
}
//桥接的还有一半---实现
public class MessageSMS implements MessageImplementor {
public void send(String message,String toUser) {
System.out.println("使用站内信方式。发送消息'"+message+"'给"+toUser);
}
}
//桥接的还有一半---实现
public class MessageEmail implements MessageImplementor {
public void send(String message,String toUser) {
System.out.println("使用邮件方式,发送消息'"+message+"'给"+toUser);
}
}
//普通消息
public class CommonMessage extends AbstractionMessage {
public CommonMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message, String toUser) {
super.sendMessage(message, toUser);
}
}
//加急消息
public class UrgencyMessage extends AbstractionMessage {
public UrgencyMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message, String toUser) {
super.sendMessage(message, toUser);
}
public Object watch(String messageId) {
return null;//获取对应的数据,组织成监控的对象,然后返回
}
}
//client測试类
public class Client {
public static void main(String[] args) {
MessageImplementor impl = new MessageSMS();
AbstractionMessage m = new CommonMessage(impl);
m.sendMessage("測试", "小李"); MessageImplementor impl2 = new MessageEmail();
AbstractionMessage m2 = new UrgencyMesssage(impl2);
m2.sendMessage("測试", "小李");
}
}
//从client的调用能够看出来,无论是要添加消息类型还是发送消息的方式,全然是件很easy的事情,由于没有耦合,扩展起来很轻松。
//关于谁来桥接
//1.由抽象部分的对象自己来创建对应的Implementor对象,依据參数推断详细创建哪个
//2.在Abstraction中创建默认的Implementor对象。假设须要。让子类来改动
//3.使用抽象工厂或简单工厂
//4.使用IoC/DI方式
//Java中的JDBC就是很典型的桥接应用
//桥接模式的本质:分离抽象和实现
//桥接模式很好地提现了开闭原则OCP
//长处:
//1.分离抽象和实现部分
//2.更好的扩展性
//3.可动态地切换实现
//4.降低子类的个数
//使用桥接模式的场景
//1.假设你不希望在抽象部分和实现部分採用固定的绑定关系,能够採用桥接模式
//2.假设出现抽象部分和实现部分都能够扩展的情况,能够採用桥接模式
//3.假设希望实现部分的改动不会对客户产生影响。能够採用桥接模式
//4.假设採用继承的实现方案,会导致产生许多子类。对于这样的情况。也可採取桥接模式

设计模式入门之桥接模式Bridge的更多相关文章

  1. Net设计模式实例之桥接模式( Bridge Pattern)

    一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...

  2. 设计模式学习心得<桥接模式 Bridge>

    说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...

  3. IOS设计模式浅析之桥接模式(Bridge)

    引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...

  4. 《JAVA设计模式》之桥接模式(Bridge)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...

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

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

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

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

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

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

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

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

  9. 桥接模式(Bridge Pattern)

    1,定义           桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...

随机推荐

  1. spoj BRCKTS - Brackets 线段树

    题目链接 给一个括号序列, 两种操作. 一种将某个位置的括号变反(左变右, 右变左), 第二种是询问这个括号序列是否合法. 线段树, 我们开两个数组lf, rg. 表示某个区间里面, 右边的左括号个数 ...

  2. 对web应用中单一入口模式的理解及php实现

    在我们web应用的开发中,经常会听见或看见单一入口模式,在我开始学习tp框架的时候也不理解为什么要运用一个单一入口模式,只是会使用,最近自己在搞一个小东西的时候才明白为什么在web开发中要运用单一入口 ...

  3. JY的题目(水)

    JY的题目[问题背景]一天,JY觉得DZY智商太低下,决定和他离婚,除非DZY做出来她出的题目.DZY当然非常想和JY在一起,所以他只好又去请计算机大神WJC帮忙,WJC已经帮过他N多次忙了,不想再帮 ...

  4. c#读取xml文件配置文件Winform及WebForm-Demo具体解释

    我这里用Winform和WebForm两种为例说明怎样操作xml文档来作为配置文件进行读取操作. 1.新建一个类,命名为"SystemConfig.cs".代码例如以下: < ...

  5. 【菜鸟学习Linux】-第一章-Linux环境搭建-安装VMware虚拟机

    本人菜鸟一个,刚毕业才上班2个月,现在用到Linux部署项目,这才开始学习Linux,以下是我在安装Linxu系统是遇到的一些问题,希望能给广大菜鸟们在学习的道路上提供帮助和指导,废话不多说!开工! ...

  6. KJFrameForAndroid框架学习----高效设置网络图片

    KJFrameForAndroid框架项目地址:https://github.com/kymjs/KJFrameForAndroid 或备用地址http://git.oschina.net/kymjs ...

  7. Tomcat的JVM内存大小如何设置?【转】

    [转]:专家答疑 Tomcat的JVM内存大小如何设置? 本文和大家重点讨论一下如何设置Tomcat的JVM内存大小,JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存 ...

  8. Fix Some bytes have been replaced with the Unicode substitution character while loading file XXX.cs with Chinese Simplified (GB2312) encoding

    When we use <strong>visual studio</strong> open source file or any other file, we may en ...

  9. sqlserver字符串拆分(split)方法汇总

    --方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5,6,7,8,9,10'set @sql='select ...

  10. BZOJ 4311: 向量( 按时间分治 + 线段树 )

    离线, 然后按时间分治, 每个向量都有出现时间[l, r], 直接插入时间线段树(一个向量只会影响O(logN)数量级的线段树节点). 在线段树每个节点弄出凸壳然后二分. 时间复杂度O(Nlog^2N ...