设计模式入门之桥接模式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的更多相关文章
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
- 设计模式学习心得<桥接模式 Bridge>
说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...
- IOS设计模式浅析之桥接模式(Bridge)
引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...
- 《JAVA设计模式》之桥接模式(Bridge)
在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 桥接模式(Bridge Pattern)
1,定义 桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
随机推荐
- python 日期、时间戳转换
获取当前日期: from datetime import datetime IN:datetime.now() OUT:datetime(2016,10,19,6,51,21,72341) 转化为字符 ...
- 图的邻接链表实现(c)
参考:算法:C语言实现 一书 实现: #ifndef GRAPH #define GRAPH #include<stdio.h> #include<stdlib.h> stru ...
- VUE.JS组件化
VUE.JS组件化 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎 ...
- C++中实现链表的删除和颠倒
MFC工程中关于链表的操作 1.对于给定的整数n,编写算法删除链表中第n个节点,该链表的第一个节点由first指向. 由于C++中没有关于node的标准头文件,要先手动定义node类,此处只定义了简单 ...
- Ubuntu 下开发环境的常规配置。
Install Chinese input (for Chinese peers) We Choose the Sougou pinying.(搜狗) $ sudo apt-get install g ...
- oracle定时执行计划任务
show parameter job_queue_processes; alter system set job_queue_processes=10; 1,创建测试表 create table jo ...
- android开发利器--站在巨人肩膀上前行
本文主要介绍有助于android开发的三方平台和站点. 一:开发阶段 1:SVN(一个开放源码的版本号控制系统) 团队开发没有server,代码管理就没那么方便了,推荐taocode阿里开源站点,方便 ...
- 深入理解Linux网络技术内幕——中断与网络驱动程序
接收到帧时通知驱动程序 在网络环境中.设备(网卡)接收到一个数据帧时,须要通知驱动程序进行处理. 有一下几种通知机制: 轮询: 内核不断检查设备是否有话要说.(比較耗资源,但在一些情况 ...
- gridview合并相同的行
#region 方法:合并Gridview行 /// <summary> /// 合并GridView指定行单元格 /// </summary> /// ...
- 关于html5之canvas的那些事
何为canvas <canvas> 标签只是图形容器,您必须使用脚本来绘制图形.默认情况下该矩形区域宽为300像素,高为150像素,设置宽高必须在canvas标签内部,不能加单位px. 大 ...