转载请注明出处!

http://blog.csdn.net/zhonghuan1992

全部配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern

跟着ZHONGHuan学习设计模式

桥接模式










学习桥梁模式之前,最好可以掌握开闭原则组合复用原则,明确这两个设计原则后,会对该模式的学习有帮助。

首先来看下桥梁模式的定义:将抽象化(Abstraction)和实现(Implementation)解耦,使得两者能够独立地变化。

看到这个定义,可能会百思不得其解,没有关系,我希望看完兴许的内容,你就行解决这个疑惑。

以下我们先看一个实例,从实例中体会,桥梁模式。

场景导入:

场景是这种。我们都知道电视,电灯。电脑都有开关。

我们这里仅仅考虑开关,不考虑其他复杂的button。好了,电视,电灯和电脑都是家具是吧。

好。是家具是吧,那么我们抽象一个家具类,让电视,电灯。和电脑都继承自这个家具类。又由于这些家具类都有开关操作。所以。我们把开关操作抽象到家具类中。

嗯哼,如今设计完家具了,另一样东西我们没考虑,开关。这个东西该怎么破呢?我们明确他们都有开和关操作,可是,控制器是不一样的,电视的开关是无线控制器开关,也能够是一个button那样的开关(这里临时不考虑电视开的两个步骤,先按遥控button开关。再按遥控器。

这里假定的是,两个开关都能打开。

)。所以如今该怎么办呢?不能用继承吧。假设用继承的话,变成以下这样.仅以电视开关举例。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmdodWFuMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

由于电视开关有两个,这两个开关继承电视,它们能够继承父类的方法,在继承的基础上改进一点。看上去不错的样子。可是这里有什么问题呢?这个问题就是,如今都是智能时代了,事实上我们能够用手机来开关我们的电视。电脑,甚至电灯,那么,事实上这里仅仅要有一个开关类手机开关就ok了是么,假设依照上面的设计,会多不少类。特别是当家具多的时候。可不能忘了组合复用原则哦。这里能够用组合,为什么不用呢?怎么组合呢?整体设计是这种,让开关操作抽象出一个抽象开关类,然后详细的开关继承这个抽象开关类。抽象开关具有一个抽象家具类的引用。当要开关操作的时候。就能够调用引用内的开关操作。

类图是以下这种。

设计完成,这种设计是不是更佳啊。事实上就是为了让开关的方式和家具类解耦。介绍编码量,能够看下图

如今让我们来看一看实现代码。

抽象家具类和电视的的实现:

abstract class Furniture
{
abstract void turnOn(); abstract void turnOff();
} class TV extends Furniture
{
void turnOn()
{
System.out.println("电视打开了");
} void turnOff()
{
System.out.println("电视关闭了");
}
}

抽象开关和智能手机的实现。

abstract class OnOff
{ // 抽象开关类
Furniture fur; abstract void turnOn(); abstract void turnOff(); void set(Furniture fur)
{
this.fur= fur;
}
} // 手机开关
class SmartPhone extends OnOff
{
void turnOn()
{
fur.turnOn();
System.out.println("用手机开的");
} void turnOff()
{
fur.turnOff();
System.out.println("用手机关的");
}
}

完整实现能够从我的github上面得到。https://github.com/ZHONGHuanGit/DesignPattern

好了,事实上你已经看完一个桥梁模式的实例了。

如今让我们来看一下桥梁模式的类图:

上面有四个角色。你能够看到,结合上面的开关样例,我想你对于这四个角色的职责有更好的了解了吧。

抽象画角色Abstraction:抽象化给出的定义,并保存对一个实例化对象的引用。

修正抽象画角色redefinedAbstraction:拓展抽象化角色。改正和修正父类对抽象化的定义。

实现化角色Implementor:给出实现化角色的接口,但不给出详细的定义,必须指出的是。操作的实现接口未必和抽象的接口定义一样,可能会有区别。

详细实现化角色:给出详细的接口实现。

使用桥梁模式的情况:

1假设一个系统须要在构件的抽象化角色和详细化角色之间添加很多其它的灵活性,避免在这两个层次之间建立静态的联系。

2设计要求实现话角色的不论什么改变不应当影响client,或者说实现话改变对client是透明的。

3一个构件有多于一个的抽象画角色和实现化角色,系统须要它们之间进行动态的耦合。

跟着ZHONGHuan学习设计模式--桥接模式的更多相关文章

  1. 转:设计模式-----桥接模式(Bridge Pattern)

    转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...

  2. 【设计模式】Java设计模式 - 桥接模式

    [设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  3. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  4. java设计模式——桥接模式

    一. 定义与类型 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承 类型:结构性. 二. 使用场景 (1) 抽象和具体实现之间增加更多的灵 ...

  5. Java设计模式学习记录-桥接模式

    前言 这次介绍结构型设计模式中的第二种模式,桥接模式. 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度. 桥接模式 桥接模式是为了将抽象化与实现化解耦,让二者可 ...

  6. 设计模式学习之桥接模式(Bridge,结构型模式)(15)

    参考地址:http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化, ...

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

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

  8. Java-马士兵设计模式学习笔记-桥接模式

    一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...

  9. 结合JDK源码看设计模式——桥接模式

    前言: 在我们还没学习框架之前,肯定都学过JDBC.百度百科对JDBC是这样介绍的[JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Jav ...

随机推荐

  1. 融云(找到“每个App都有沟通的需求”的细分市场)

    近日,国内著名App驾考宝典和融云达成合作,为应用增加IM功能,实现亿级用户之间聊天.消息一出,IM(即时通讯)领域的大佬,同时也是个上线不到两岁的新生力量,再次引发了行业的关注. 对业内人士而言,即 ...

  2. Arduino Nano + WIZ550io = 简易上网

    我爱Arduino Nano – 这是一个非常好外形小巧却功能齐全的Arduino Uno.然而.当我去将它连接到互联网,全部的干净利落小巧也消失在大尺寸的以太网盾底下了. 只是,我近期发现了一个更好 ...

  3. AVL树----java

                                                                                        AVL树----java AVL ...

  4. JQuery - 点击,滚动回到顶部 / 底部刷新回到顶部

    if ($(document).scrollTop() != 0) { //刷新之后,回到顶部 $('body,html').animate({ scrollTop: 0 }, 500); }

  5. UpdateWindow API函数的作用很明显

    待续 摘自<Delphi深度历险>

  6. Jsp中使用数据库连接池.

    原文 Jsp中使用数据库连接池. 1. 在tomcat服务器目录下面的conf中找到一个叫Context.xml的配置文件,在其中加入以下代码 <Resource name="jdbc ...

  7. Jsoup API解析HTML中input标签

    Jsoup官网地址:http://jsoup.org/ 1. 解析单个input元素     String html = "<p><input align=\"t ...

  8. Android颜色转换工具类ColorUtil

    项目中需要根据ScrollView的滚动距离来动态设置Topbar的背景透明度,网上有类似的开源库FadingActionBar,使用的是ActionBar做的.而我的项目中并没有使用ActionBa ...

  9. 细说UI线程和Windows消息队列

    在 Windows应用程序中,窗体是由一种称为“ UI线程( User Interface Thread)”的特殊类型的线程创建的. 首先, UI线程是一种“线程”,所以它具有一个线程应该具有的所有特 ...

  10. 与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知

    原文:与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知 [索引页][源码下载] 与众不同 windows phone ( ...