转载请注明出处!

!http://blog.csdn.net/zhonghuan1992

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

跟着ZHONGHuan学习设计模式

桥接模式

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

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

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

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

场景导入:

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

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

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

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

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

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

由于电视开关有两个,这两个开关继承电视,它们能够继承父类的方法,在继承的基础上改进一点。看上去不错的样子。可是这里有什么问题呢?这个问题就是,如今都是智能时代了,事实上我们能够用手机来开关我们的电视。电脑,甚至电灯,那么,事实上这里仅仅要有一个开关类手机开关就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一个构件有多于一个的抽象画角色和实现化角色,系统须要它们之间进行动态的耦合。

转载于:https://www.cnblogs.com/mengfanrong/p/5164309.html

跟着ZHONGHuan学习设计模式--桥接模式相关推荐

  1. 【学习笔记】ABAP OOD设计模式 - 桥接模式

    ABAP OOD设计模式 - 桥接模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 桥接模式又称为桥梁模式,在程序开发中,采用不同的维度分解一系列对象,然后采用组 ...

  2. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  3. 2.设计模式-桥接模式

    文章目录 一.使用场景 二.实现方法 三.优势与劣势 四.经典案例 本文笔记来自于: 狂神的设计模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构模型,又称为柄体( ...

  4. 设计模式--桥接模式(Bridge)

    设计模式–桥接模式(Bridge) 1.定义 桥接模式:将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.实例 设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图 ...

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

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

  6. 23种设计模式——桥接模式

    文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...

  7. 设计模式——桥接模式实验报告

    目录 设计模式--桥接模式实验报告 一.实验题目 二.所用模式结构视图 三.本实例类图 四.实例实现代码 1.抽象消息类 2.普通消息类 3.加急消息类 4.特急消息类 5.实现发送消息的统一接口: ...

  8. #软件设计模式#桥接模式#小黑的学习笔记

    bridge pattren: 个人简单理解 当出现两个角色,且它们之间存在一定的制约关系,纬度高的角色含有对维度低角色的引用,这个引用就相当于桥梁.这样避免了它们之间出现继承关系,使得纬度低的角色不 ...

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

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

最新文章

  1. Google更新机器学习开发套件ML Kit,新增支持自动回复与语言识别
  2. 遇到MapStruct后,再也不手写PO,DTO,VO对象之间的转换了
  3. Kubernetes 桌面客户端:Lens
  4. 操作篇 ARP协议欺诈
  5. Powerline专用字体安装_PowerFonts字体库安装_Meslo LG字体安装
  6. pythonwhile循环love_input和while循环——Python编程从入门到实践
  7. 初学Linux第三周
  8. php商城的购物车功能,php实现购物车功能(以大苹果购物网为例)
  9. unity3D常见问题
  10. 曝微信低调上线“银行储蓄”服务,这是越来越像支付宝的节奏?
  11. 《avascript 高级程序设计(第三版)》 ---第三章 基本概念2
  12. 雷电模拟器下载与安装Fiddler证书,详细抓包教程
  13. 安:[摩斯密码表]摩斯密码对照表
  14. java IO流分类
  15. 彩灯控制器课程设计vhdl_基于VHDL的彩灯控制器的设计
  16. jquery的图片播放插件 - colorbox
  17. 新买的显示器怎么测试软件,新买的电视如何检测屏幕?记住这个方法
  18. idea中的.iml和.idea能删除么——可以
  19. 新冠疫情历史数据(COVID-19-Data)
  20. 华为服务器维修报告,服务器运维报告

热门文章

  1. Java 工具包收藏
  2. OSChina 周一乱弹 ——节后突然不想上班的节奏
  3. 小试牛刀:文本处理工具之grep、egrep详解
  4. 回首十年——写给还在各等级教育中盲目学习的人
  5. ArcGIS 10.2.2利用Anaconda集成scipy和pandas
  6. java 补丁差异_差异和补丁简介
  7. Ansible,Linux应用程序,Jupyter笔记本,Raspberry Pi婴儿监视器,Python等
  8. 什么是智能合约 区块链_什么是区块链智能合约?
  9. 开源中国 精彩回顾_如何撰写精彩的事件回顾
  10. (5)容器级标签和文本级标签