设计模式初探-桥接(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 介绍 ...
随机推荐
- Spring JDBC对象批量操作
以下示例将演示如何使用spring jdbc中的对象进行批量更新.我们将在单次批次操作中更新student表中的记录. student表的结果如下 - CREATE TABLE student( id ...
- Linux目录和文件管理
今天我们来介绍一下对于Linux系统“命令“的理解和分类以及常用的目录文件管理命令的使用. 一. 命令 用于实现某一类功能的指令或程序,命令的执行依赖于解释器程序(例如:/bin/bash) 分类 内 ...
- Linux入门基础教程之Linux下软件安装
Linux入门基础教程之Linux下软件安装 一.在线安装: sudo apt-get install 即可安装 如果在安装完后无法用Tab键补全命令,可以执行: source ~/.zshrc AP ...
- 给zTree添加onSelect callback
由于jquery ui没有集成tree控件,所以在网上找到了zTree v3.zTree无疑是功能非常强大的一款jquery的插件,而且是国人作品,zTree的文档写得也非常好,效果很炫.但是我在使用 ...
- Objective-C语法之字符串NSString去掉前后空格或回车符(可以是NSCharacterSet类型的其它字符)
main.m #import <Foundation/Foundation.h> #import "NSString+Trim.h" int main(int argc ...
- HTML标签嵌套规则
摘要: 最近在整理项目时发现有些同事写的页面代码嵌套的太多,而且有些嵌套不对,比如<a><div>内容</div></a>.虽然功能实现了,但是对于浏 ...
- python 上下文处理错误,记录日志
之前发过了装饰器版本的异常记录日志,但是需要装饰在函数或方法上.此篇用上下文管理,用一个with就能记录错误了,不需要写成函数. import traceback # pip install mult ...
- python使用pyqt写带界面工具
上篇介绍的使用python自带tkinter包,来写带界面的工具. 此篇介绍使用pyqt来开发测试工具. tkinter的好处是python官方自带,上手容易(但手写控件复杂),布局和摆放都不直观和容 ...
- numpy和Matplotlib篇---2
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 5.3 Python的科学计算包 - Numpy numpy(Numerical Python ...
- Java并发编程、内存模型与Volatile
http://www.importnew.com/24082.html volatile关键字 http://www.importnew.com/16142.html ConcurrentHash ...