设计模式初探-桥接(Bridge)模式
桥接(Bridge)模式,又称Handle/Body模式,属于对象结构型模式。用于将抽象部分与它的实现部分分离,使它们都可以独立地变化。比如常见的电脑窗口界面,不同的操作系统其窗口界面绘制的原理肯定不一样。这里,窗口界面就相当于抽象部分(Abstraction),而窗口界面本身也可以随着功能的不同而进行扩充,扩充的窗口就是抽象窗口的扩充抽象类(RefinedAbstraction),这些抽象需要具体的操作系统实现才能被我们看到,那基于操作系统的窗口实现就是实现部分(Implementor),不管是Window,Linux还是Mac。Window,Linux或Mac则是实现接口的具体实现类(ConcreteImplementor)。
一、使用场景
1、如果一个系统需要在抽象和具体之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,那么可以通过桥接模式使它们在抽象层之上建立一个关联关系,从而增加灵活性。
2、“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
3、一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
4、对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
二、UML图
三、Java实现
package study.patterns.bridge;
/**
* 桥接模式:通过将维度解耦来处理多维度的变化。
* @author qbg
*/
public class BridgePattern {
public static void main(String[] args) {
/**
* 对于客户端而言,可以针对两个维度的抽象层编程,在程序运行时再动态确定两个维度的子类,
* 动态组合对象,将两个独立变化的维度完全解耦,以便能够灵活地扩充任一维度而对另一维度不造成任何影响。
*/
Brush brush = new LargeImpl();
BrushImpl impl = new RedImpl();
brush.setBrushImpl(impl);
brush.drawPicture("蒙娜丽莎的微笑");
}
}
/**
* 辅助类:画
*/
class Picture{}
/**
* 画笔的抽象基类:变化维度有种类,型号,颜色等,
* 此处拿型号(大,中,小)和颜色(红,绿,蓝)做示例维度.
* 型号为抽象维度,颜色为实现维度.
* 如果需要添加新型号的画笔,只需扩充抽象类Brush;
* 如果需要添加新的画笔颜色,只需增加BrushImpl接口的具体实现类.
*/
abstract class Brush{
protected BrushImpl impl; public void setBrushImpl(BrushImpl impl){
this.impl = impl;
}
/**
* 抽象部分的业务方法:画画
*/
public abstract void drawPicture(String name);
}
/**
* 抽象画笔颜色实现类:实现类接口
*/
interface BrushImpl{
public void doDraw(Picture pic); //涂抹相应的颜色
}
/**
* 红色画笔实现类:具体实现类
*/
class RedImpl implements BrushImpl{
@Override
public void doDraw(Picture pic) {
System.out.println("涂抹红色。。。。");
}
}
/**
* 绿色画笔实现类:具体实现类
*/
class GreenImpl implements BrushImpl{
@Override
public void doDraw(Picture pic) {
System.out.println("涂抹绿色 。。。。");
}
}
/**
* 蓝色画笔实现类: 具体实现类
*/
class BlueImpl implements BrushImpl{
@Override
public void doDraw(Picture pic) {
System.out.println("涂抹蓝色 。。。。");
}
} /**
* 大号画笔:扩充抽象类
*/
class LargeImpl extends Brush{
@Override
public void drawPicture(String name) {
//模拟使用画笔勾勒画的线条
Picture pic = new Picture();
impl.doDraw(pic);
System.out.println(name+",使用大号画笔绘制。。。");
}
}
/**
* 中号画笔:扩充抽象类
*/
class MediumImpl extends Brush{
@Override
public void drawPicture(String name) {
//模拟使用画笔勾勒画的线条
Picture pic = new Picture();
impl.doDraw(pic);
System.out.println(name+",使用中号画笔绘制。。。");
}
}
/**
* 小号画笔:扩充抽象类
*/
class TinyImpl extends Brush{
@Override
public void drawPicture(String name) {
//模拟使用画笔勾勒画的线条
Picture pic = new Picture();
impl.doDraw(pic);
System.out.println(name+",使用小号画笔绘制。。。");
}
}
四、模式优缺点
优点:
1、分离抽象接口及其实现部分。桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
2、在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。
3、桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。
缺点:
1、桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。
PS:上面的总结参考自livelion,经验尚浅,只能仰仗大神!
设计模式初探-桥接(Bridge)模式的更多相关文章
- Java 实现桥接(Bridge)模式
类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamp3d21scDQ1Ng==/font/5a6L5L2T/fontsize/400/fill/I0 ...
- 设计模式C++描述----09.桥接(Bridge)模式
一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...
- Java设计模式---桥接Bridge模式
参考于 : 大话设计模式 马士兵设计模式视频 写在开头: 桥接模式主要用于一件事物分成了两个维度,进行排列组合,比如礼物,可以分成优雅的礼物(抽象),花(具体),排列组合优雅的花! 1.为什么使用桥接 ...
- 设计模式--桥接(Bridge)模式
1.概述: 桥接模式:把抽象和行为分离开来,中间需要某个介质来连接抽象化和行为化.此模式的概述听起来非常像适配器模式,不要搞混了,虽然都是借用中间介质,但意义不同.最典型的桥接模式就是:JDBC.通过 ...
- 漫谈设计模式(三):桥接(Bridge)模式 —— 将类功能、结构两层次分离
1.前言 类主要有两个层次,一个是功能层次,另一个是实现层次. 功能层次,一般应用于当前类不能满足多样化的业务需求,让子类去继承(具体)父类,添加加一些父类中没有的功能(一般是增加新的方法),这就属于 ...
- 桥接(Bridge)模式
桥接模式又称为柄体模式或接口模式.桥接模式的用意就是"将抽象化与实现化解耦,使得二者可以独立变化". 抽象化: 存在于多个实体中的共同的概念性联系,就是抽象化.作为一个过程,抽象化 ...
- JAVA设计模式初探之组合模式
先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.” 就拿剪发办卡的事情来分析一下吧. 首先,一张卡可以在总部,分店, ...
- [设计模式] 7 桥接模式 bridge
#include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
随机推荐
- [深入理解Android卷一全文-第三章]深入理解init
因为<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...
- Compile cpp File Manually without IDE under Mingw Environment
环境准备. 安装mingw并设置好系统PATH. mingw.windows下的GUN编程环境. 系统变量的作用--可运行文件的搜索路径. 这样在cmd直接输入g++就能调用到D:\Program F ...
- Lynx
http://www.unlinux.com/doc/soft/20051105/7402.html http://www.today-wx.com/linux/274.html 把 HTML 转成文 ...
- 最好的Java和Android开发IDE---IntelliJ IDEA使用技巧
转载请注明网址:http//:www.cnblogs.com/JohnTsai 以前一直使用的是Eclipse,听别人介绍说IDEA非常不错,也为了以后转Android studio铺垫下.就开始尝试 ...
- 常用的PostBuild Event 脚本
参考: http://blog.csdn.net/fengzhijiaxu/article/details/4827364 http://blog.csdn.net/teng_ontheway/art ...
- geoserver入门
1.什么是Universal Transverse Mercator system 翻译名叫做通用横轴魔卡托系统,通常称为UTM.这个投影系从中心子午线把世界分成一系列6度的纵向宽区域. 2.什么是w ...
- 视觉单词模型、词袋模型BoW
多用于图像检索.分类 3.2.1.4 视觉单词模型 视觉词袋(BoVW,Bag of Visual Words)模型,是“词袋”(BoW,Bag of Words)模型从自然语言处理与分析领域向图像处 ...
- 安装Python模块:pygame
Pygame项目托管在代码分享网站Bitbucket中.要在Windows系统中安装Pygame,请访问https://bitbucket.org/pygame/pygame/downloads/ , ...
- ITIL之“变更管理”
首先要说明的是ITIL的变更是指“上线系统的变更”,而不是指系统建设的变更. ITIL的变更的流程如下: 整个变更管理在实际操作中有几个注意点: 1. 现存的企业中,变更咨询委员会(CAB)可能只有信 ...
- mysql中查看视图的元数据?
需求描述: 查看视图的元数据的方法. 操作过程: 1.通过查看information_schema数据库下的views表来查看视图的定义语句 mysql> select definer,view ...