桥模式设计模式进入Bridge
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的更多相关文章
- Java设计模式(6)桥模式(Bridge模式)
Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...
- 设计模式 - Bridge 桥模式
Bridge桥模式也属于"的单一职责"模式中的典型模式.问题描述:我们绘制图形时,图形可以有不同形状以及不同颜色,比如圆形可以是红的,绿的,方形可以是红的绿的,如果用代码来描绘这些 ...
- c++ 设计模式7 (Bridge 桥模式)
4.2 Bridge 桥模式 动机: 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个变化的维度. 代码示例: 实现一个Messager,含有基本功能PlaySound,Connec ...
- Bridge 桥模式
之前一直以为桥是简单地沟通几个不同接口,使之能够按照一定流程工作.但重新查了一下解释,才有新解. 对于同一个产品的不同影响因子,如果使用继承的话,则这些影响因子则会按照M1*M2* ... Mn的数量 ...
- JavaScript高级---桥模式设计
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 图文详解AO打印(端桥模式)
一.概述 AO打印是英文Active-Online Print的简称,也称主动在线打印.打印前支持AO通讯协议的AO打印机首先通过普通网络与C-Lodop服务保持在线链接,网页程序利用JavaSc ...
- 设计模式之Bridge(桥接)(转)
Bridge定义 : 将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用? 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...
- 图文详解AO打印(端桥模式)(转)
一.概述 AO打印是英文Active-Online Print的简称,也称主动在线打印.打印前支持AO通讯协议的AO打印机首先通过普通网络与C-Lodop服务保持在线链接,网页程序利用JavaSc ...
- js---25桥模式
桥接模式是一种既能把两个对象连接在一起,又能避免二者间的强耦合的方法.通过“桥”把彼此联系起来,同时又允许他们各自独立变化. 主要作用表现为将抽象与其实现隔离开来,以便二者独立化. <!DOCT ...
随机推荐
- TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)
注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): 其中TWinControl对TControl有10个消息进行了覆盖(红色标记),其中有2个是WM_消息,8个是CM_消 ...
- iOS 史上最全的图片压缩方法集合
做上传图片功能,特别是类似于微信,QQ里面,公布9张图片, 少不了碰到一个问题,就是图片压缩问题,当然我也遇到了. 我研究了这个问题,发现网上普遍的方法是例如以下 //压缩图片质量 +(UIImage ...
- Python 实现的下载op海贼王网的图片(网络爬虫)
没得事就爬一下我喜欢的海贼王上的图片 须要在d盘下建立一个imgcache目录 # -*- coding: utf-8 -*- import urllib import urllib2 import ...
- 008实现一个算法从一个单链表中返回倒数第n个元素(keep it up)
我们维护两个指针, 它们之间的距离为n. 然后.我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变. 那么, 当第二个指针指到空时.第一个指针即为所求. #include <ios ...
- Windows内核
每天我们都在使用Windows系统学习.编程.听音乐.玩游戏,Windows的操作想来是非常熟练了,但是你又对Windows究竟了解多少呢?本系列的目的,就是让你对Windows系统有个更直观.更清楚 ...
- ExtJs 设置GridPanel表格文本垂直居中
业务场景,需要实现最终效果图如下: GridPanel代码如下配置: { xtype : 'grid', id : 'grid_jglb', frame : true, region : 'cente ...
- 【Python】Coding the Matrix:Week 5 Perspective Lab
这个Lab的内容光是说明就有7页之巨,我反复看了很久才看懂一点点,Lab主要完成的是从不同坐标系表示之间变换的方法. 原始的图片,从Camera basis的表示转换成WhiteBoard basis ...
- [WPF]使用Pack URI路径訪问二进制资源
一.路径格式定义 完整的URI定义为: pack://application,,,[/可选程序集名称;][可选版本;][目录名称/]文件名 缩略后的写法是: [目录名称/]文件名 二.在XAML代码中 ...
- Ubuntu 使用中的问题总结
1.ibus输入法图标消失 #ibus-daemon -d 2.Ubuntu没有声音 #alsamixer 3.“对不起,ubuntu出现了内部错误” # nano /etc/default/appo ...
- 用Python的Tkinter实现时钟
import Tkinter,sys,time root=Tkinter.Tk() root.minsize(, ) Label1=Tkinter.Label(text=time.strftime(' ...