转载请注明出处!

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. 【linux】内核源代码下载与阅读

      原创,转载时请注明,谢谢.邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://blog. ...

  2. CSS未知div高度垂直居中代码_层和布局特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. overflow:hidden与position:absolute

    在做一个下拉框的动画效果中遇到了这个bug,记录一下. 在写下拉框的动画的时候,一般我们的做法都是把下拉框的外盒子设为overflow:hidden,然后设下外层盒子高度,之后通过js慢慢的改变高度从 ...

  4. 《火球——UML大战需求分析》(第2章 耗尽脑汁的需求分析工作)——2.1 需求分析面面观

    说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...

  5. android 使用Scroller实现缓慢移动

    在Launcher中的Workspace中实现了左右屏幕切换效果,里面就用到了Scroller记录滑动轨迹,实现一种缓慢地向左或向右移动的效果,这里我对这种效果进行总结: 我们先看一个例子:点击按钮时 ...

  6. mssql 返回表的创建语句

    if OBJECT_ID('sp_create_table_sql','P') is not null drop proc sp_create_table_sql go create proc sp_ ...

  7. org.apache.hadoop.ipc.Client: Retrying connect to server异常的解决

    检查发现是DataNode一直连接不到NameNode. 检查各个节点在etc/hosts中的配置是否有127.0.1.1 xxxxxx.如果有把其屏蔽或者删除,重启各节点即可. 原因:127.0.1 ...

  8. Codeforces Round #214 (Div. 2) C. Dima and Salad (背包变形)

    C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)

    string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...

  10. 关于WM_ERASEBKGND和WM_PAINT的深刻理解

    一直以来,对于WM_PAINT和WM_ERASEBKGND消息不是很清楚,从书上和网上找了很多资料,大体上有以下几点说法:1>WM_PAINT先产生,WM_ERASEBKGND后产生 2.WM_ ...