转载请注明出处!

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. MYSQL查询表结构

    mysql查看表结构命令,如下: desc 表名;show columns from 表名;describe 表名;show create table 表名; use information_sche ...

  2. JAVA之File类创建对象构造函数传参数需要注意的几点

    java中File类用于创建一个文件对象. 首先看一段代码: 1. package MyText1; import java.io.File; public class MyText1 { publi ...

  3. 树后台数据存储(採用webmethod)

    树后台数据存储 关于后台数据存储将集中在此篇解说 /* *作者:方浩然 *日期:2015-05-26 *版本号:1.0 */ using System; using System.Collection ...

  4. asp.net微软认证全新考试题库及答案1

    1.你创建了一个ASP.net应用程序,该程序将运行在TK公司的WEB站点上.你的应用程序包括100个WEB页面.你想配置你的应用程序,当HTTP代码发生错误时,可显示自定义的错误信息给用户.同时你想 ...

  5. 将n进制的数组压缩成字符串(0-9 a-z)同一时候解压

    比如一个3进制的数组: [1 1 2 2 2 0 0] 用一个字符串表示... 此类题目要明白两点: 1. 打表:用数组下标索引字符.同一时候注意假设从字符相应回数字: int index = (st ...

  6. iebook 发布到网站 独家秘诀

    iebook 普通版只能产生exe文件,无法生成web公布的文件需要,因此,我们需要专业版. iebook2011版本并没有破解版,下面是一个iebook2010破解版: http://downloa ...

  7. ZOJ 2679 Old Bill(数学)

    主题链接:problemCode=2679" target="_blank">http://acm.zju.edu.cn/onlinejudge/showProbl ...

  8. perl 异步超时 打印错误

    #!/usr/bin/perl use AnyEvent; use AnyEvent::HTTP; my $cv = AnyEvent->condvar; sub doit{ my $url = ...

  9. 【Demo 0004】屏幕、窗体及视图基础知识

    本章学习要点       1.  了解iOS中应用程序(UIApplication)与屏幕.窗体以及视图相关基础知识:       2.  掌握应用程序常用的属性与方法:        3.  掌握窗 ...

  10. 给你的站点加入 console.js

    本文仅先给使用console调试的FE同学,假设你还不知道console是什么.或者还停留在alert阶段,那就不要浪费时间了,say bay bay! 你是否试程序的过程中用过console.log ...