跟着ZHONGHuan学习设计模式--桥接模式
转载请注明出处!
!
!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学习设计模式--桥接模式的更多相关文章
- 转:设计模式-----桥接模式(Bridge Pattern)
转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...
- 【设计模式】Java设计模式 - 桥接模式
[设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
- java设计模式——桥接模式
一. 定义与类型 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承 类型:结构性. 二. 使用场景 (1) 抽象和具体实现之间增加更多的灵 ...
- Java设计模式学习记录-桥接模式
前言 这次介绍结构型设计模式中的第二种模式,桥接模式. 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度. 桥接模式 桥接模式是为了将抽象化与实现化解耦,让二者可 ...
- 设计模式学习之桥接模式(Bridge,结构型模式)(15)
参考地址:http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化, ...
- 设计模式学习心得<桥接模式 Bridge>
说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...
- Java-马士兵设计模式学习笔记-桥接模式
一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...
- 结合JDK源码看设计模式——桥接模式
前言: 在我们还没学习框架之前,肯定都学过JDBC.百度百科对JDBC是这样介绍的[JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Jav ...
随机推荐
- CSS3实现时间轴效果
原文:CSS3实现时间轴效果 最近打开电脑就能看到极客学院什么新用户vip免费一个月,就进去看看咯,这里就不说它的课程怎么滴了,里面实战路径图页面看到了这个效果: 有点像时间轴的赶脚,而且每一块鼠标悬 ...
- 升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)
Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系 ...
- linux下nginx负载均衡部署
nginx负载均衡部署 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 server,也是一个 IMAP/POP3/SMTP 代理server. Ngi ...
- Sprite Kit教程:制作一个通用程序 2
注1:本文译自Sprite Kit Tutorial: Making a Universal App: Part 2 目录 动画的定义:可行性 属性列表 添加游戏逻辑 添加音效 何去何从 上一篇文章中 ...
- greatis很不错,出售源代码
http://www.greatis.com/delphicb/ 特别是: http://www.greatis.com/delphicb/imgedit/
- 发掘ListBox的潜力(三):显示即时提示(Tips)
ListBox显示即时提示(Tips) Listbox内容太长时超出Listbox宽度的部分将无法显示,一种解决方法是让Listbox产生横向滚动条,滚动显示内容(见前面的<发掘ListBox的 ...
- ajax和json详解
responseText 属性以字符串形式返回HTTP响应. responseXML 属性以XML形式返回HTTP响应. JSON.stringify 函数 (JavaScript) 将 Jav ...
- UVA 311 Packets 贪心+模拟
题意:有6种箱子,1x1 2x2 3x3 4x4 5x5 6x6,已知每种箱子的数量,要用6x6的箱子把全部箱子都装进去,问需要几个. 一开始以为能箱子套箱子,原来不是... 装箱规则:可以把箱子都看 ...
- 超越Web,Javascript在物联网的应用
引子 Patrick Catanzariti 是一名Web开发project师,近期他在 sitepoint 发表了<JavaScript Beyond the Web in 2014>, ...
- 让动态创建的ActiveX控件响应Windows消息
当我们通过 CWnd::CreateControl() 动态创建 ActiveX 控件时, Windows 消息并不会被发送给我 们的由 CWnd 派生得控件类.例如,即使我们为 WM_KIL ...