Birdge(桥接)模式
1、出现原因
1、同一个类型,有两个变化的维度(两个维度的抽象:一个抽象部分的抽象,一个实现部分的抽象)
2、如何应对这种“多维度的变化”?如何利用面向对象技术来使得同一类型可以轻松地沿着两个方向变化,而不引入额外的复杂度?
2、具体的例子
数据库操作
操作类型:增删改查 (具体功能的实现部分)
操作对象:客户,订单,产品…(对应上面的增删改查是 1对多的关系(通过聚合关系联系起来))
手机软件
软件功能:通讯录,游戏
支持品牌:M(摩托骡拉),N(喏鸡呀)
计算机软件
软件功能:游戏,开发工具,绘图软件…
运行平台:Windows,Unix….
过度的使用继承:
——以手机软件为例:
以手机品牌分类:

以手机软件分类:

我们仔细观察,如果给上面的增加一个手机软件,,那么每个手机品牌都要增加这个手机软件,都要变化,耦合度太高了。
使用桥接模式重构上面的:

3、意图:
将抽象部分与实现部分分离,使它们都可以独立地变化。
4、结构图:

5、代码演示
Birdge模式
客户端代码:

1 //创建抽象
2 PhoneBrand samsung = new Samsung();
3 //创建实现
4 IPhoneSoftware soft1 = new QQ();
5 IPhoneSoftware soft2 = new KuGou();
6 //将抽象和实现相结合
7 samsung.Instance(soft1);
8 samsung.Instance(soft2);
9
10 samsung.StareAllSoftware();

6、实现要点
1、Abstraction(抽象部分):定义抽象类的接口;;并维护指向Implementor类(实现部分)的对象指针。(抽象部分变化不会影响到实现部分,实现部分变化不会影响到抽象部分,因为他们是通过 聚合关系 连接起来的,扩展只是对他们各自的抽象 进行扩展变化)
2、Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。事实上这两个接口可以完全不同。(因为是对 各自方面的抽象(是两个不同的维度),通过 聚合关系 联系起来)
3、一般而言,Implementor接口仅提供基本操作(实现部分的具体功能),而Abstraction(是对 具体实现的 调用)则定义了基于操作的较高层次的操作。
7、效果
1、将接口(抽象)与实现分离:一个接口可以有若干实现(聚合关系),一个实现也可以为若干对象服务(一个实现的部分的具体功能 可以进行 复用,,可以多个对象(抽象下面具体的 扩展的抽象)里面进行使用),表示逻辑的对象可以动态地与实现功能的对象组合。
2、提高可扩充性:逻辑和实现都可以通过类层次的扩展进行扩充。
3、逻辑和实现被封装在不同的对象中,逻辑对实现的引用是动态进行的。在实际中,需要分别用不同的“工厂”创建逻辑和实现,然后组装。
8、适用性
1、不希望在业务(抽象部分)和业务的软件(实现部分)实现之间存在固定的绑定关系。例如,不希望“入库”业务过程和具体的数据库访问技术或数据库管理系统有过于密切的关系。
2、希望类的抽象和实现部分可以扩充,进而实现不同的抽象接口和实现部分的组合。(实现部分可以在不同的抽象部分 可以被复用)
修改实现部分对用户不产生影响,即代码无须重新编译。(因为用户操作的是实现的接口,具体的实现接口下面的实现部分已经封装起来了)
3、复用实现部分。由于实现部分所处的层次较低,因此可以被多种业务模块复用。例如,数据库访问模块可以用在多种业务单元中。
9、总结
1、Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
2、所谓抽象和实现沿着各自维度的变化,即“子类化”它们。得到各个子类之后,便可以任意组合它们。
3、Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4、Bridge模式的应用一般在“两个非常强的变化维度”(含有两个方向可以进行派生),有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式(设计模式是一种思想,并不一定要硬套)。
Birdge(桥接)模式的更多相关文章
- BridgePattern(桥接模式)
/** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...
- PHP设计模式(八)桥接模式(Bridge For PHP)
一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...
- 设计模式(八)桥接模式(Bridge Pattern)
一.引言 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视 ...
- 设计模式--桥接模式Bridge(结构型)
一.概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或者多个维度的变化,如何应对这种"多维度的变化",就可以利用桥接模式. 引例: 设想如果要绘制矩形.圆形.椭圆.正方形,我 ...
- vmware中虚拟机与主机ping不通,桥接模式,IP地址在同一网段,无法互ping!
现象描述:网卡选用的桥接模式,IP地址在同一个网段,虚拟机内部可以正常上网,但是Guest OS和Host OS无法互ping! 原因:虚拟机里的防火墙没有关闭,导致禁用ping功能. 解决方法:关闭 ...
- 桥接模式/bridge模式/对象结构型
意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...
- Objective-C 桥接模式 -- 简单实用和说明
桥接模式---把两个相关联的类抽象出来, 以达到解耦的目的 比如XBox遥控器跟XBox主机, 我们抽象出主机和遥控器两个抽象类, 让这两个抽象类耦合 然后生成这两个抽象类的实例XBox & ...
- C#设计模式-桥接模式
这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控 ...
- C#设计模式系列:桥接模式(Bridge)
1.桥接模式简介 1.1>.定义 当一个抽象可能有多个实现时,通常用继承来进行协调.抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现.继承机制将抽象部分与它的实现部分固定在一起,使得 ...
- 《JS设计模式笔记》 4,桥接模式
//桥接模式的作用在于将实现部分和抽象部分分离开来,以便两者可以独立的变化. var singleton=function(fn){ var result; return function(){ re ...
随机推荐
- hdu 1533 Going Home 最小费用流
构建地图非常easy bfs预处理地图.距离的成本 来源所有m建方,流程1费0 m所有H建方,流程1距离成本 H汇点建设成为各方.流程1费0 #include<cstdio> #inclu ...
- 第4章 建造者模式(Builder Pattern)
原文 第4章 建造者模式(Builder Pattern) 定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 实用范围 1 当创建复杂对象 ...
- Blocks and Variables
Blocks and Variables https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Blocks/A ...
- 【LeetCode】 String中的最长回文
java 普通版: 1.正序遍历数组,取得子字符串的首字母. 2.倒序遍历数组,取的子字符串的尾字母. (这样仅仅要在子循环中第一个出现回文,那么该回文肯定是本次循环的最长的回文) 3.新增数据结构, ...
- crawler_UE使用技巧
UE使用技巧 Tip 1: 如何去掉所编辑文本中包含特定字符串的行? 这则技巧是在UltraEdit的帮助文件里提到.CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式&q ...
- linux_apt-get 使用详解
安装应用从互联网上下载查询时 用到,今天安装个 mysql 简化流程如下: apt-cache search mysql-server sudo apt-get install mysql-serve ...
- MVC提交时验证
第一种 @using (Html.BeginForm("ProdPromotionEdit", "Product", FormMethod.Post, new ...
- 我在Github上的flare-spark项目
Flare-Spark 介绍 我在自己的github上建了个flare-spark项目,本身是Apache Spark项目Master分支的镜像.在Spark的基础上,添加了flare子项目. 估计大 ...
- JS判断Array数组中是否包含指定元素
1.调用方式: var arr=["a","b"]; alert(arr.in_array("a")) 2.JS判断数组是否包含指定元素方法 ...
- C语言学习笔记-顺序表
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include "coni ...