跟着实例学习设计模式(9)-桥接模式bridge(结构型)
桥接模式属于结构型设计模式。
设计意图:将抽象部分与实现部分分离。使它们都能够独立的变化。
一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这种实现啊!那怎么还有这么个桥接的分离呢?
我们先来看个样例。
比如:汽车品牌内置导航仪,我们希望实现,每一个品牌的导航仪都能够在不论什么一个牌子的汽车上安装并启动。
汽车品牌有两个:宝马、奔驰。
导航仪有三个牌子:神行者、北斗、高德。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
来看正常的设计,我们肯定是会这种採用继承来实现每一个组合的安装和启动处理的,每一个品牌+导航都须要一个独立的类来实现功能。可是这里有个一个问题。假设我们再添加一个品牌那么就意味着要再添加三个类。每添加一个品牌都是如此。这是一件太痛苦的事啊!所以能找到一种方式不用添加类就能够实现新品牌安装并开启导航仪的功能吗?
来看以下的图,我们将汽车品牌和导航仪品牌做一个组合。
假设能这样组合。那每添加一个汽车品牌时,就仅仅须要添加一个品牌类就好。这个品牌和之前的导航仪组合就能够了。
我们能够看出导航仪和汽车事实上是一种聚合关系,也就是导航仪仅仅是汽车的一部分,而这一部分不随着汽车消亡而消失。所以他们之间是松耦合关系。聚合关系。
桥接模式是遵循了合成/聚合复用原则(稍后我们在介绍该原则),我们来看通用通用类图。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
Abstraction:定义抽象类的接口。该接口中定义怎样使用Implementor接口类型对象的方法。
RefinedAbstraction:实现由Abstraction定义的接口方法,可能会有自己的一些私有方法。
Implementor:定义Abstraction抽象的实现,这样的实现是一种嫁接的关系,就像计算机主板和声卡、显卡的关系一样,它能够是一个接口, Implementor接口提供Abstraction抽象接口须要的操作,而 Abstraction则定义了基于这些基本操作的较高层次的操作。
ConcreteImplementor:实现Implementor接口并定义它的详细实现。
让我们来看实例代码,通过实例代码能够更好的理解桥接模式的奇妙。它真的是实现可插拔式的模式。
package com.bridge; /**
* 1:汽车品牌抽象类,这个抽象类主要是导航的安装与启动,其他的配件也能够在该类提供方法,
* 可是为了开-闭原则。最好能够在另加其他接口。 * 2:桥接就是要实现插拔方式的调用。我们想一下主板和插件。主板提供接口定义该接口的功能,
* 由插件来实现该接口的功能。这就是桥接的主要思想,抽象与实现分离。
* 3:该类定义了怎样注入一个接口的方法install,并定义了怎样操作注入接口的详细实现的方法open。
* 4:这里事实上能够使用接口,假设使用接口。那就更灵活。以后我再给大家写一个多个接口的样例
* ,每一个配件一个接口。 这样每一个品牌的汽车能够实现多个接口也就能够添加不同的配件了。 * @author gaoxu
* 实践出真知。
*/
public abstract class AbstractVehicleBrand {
/**安装导航方法
* @author gaoxu
* @param n
*/
public abstract void install(INavigator n); /**开启导航
* 开启导航是调用导航接口实现类的方法。事实上那个方法就是我们这种方法的延伸。 * @author gaoxu
*/
public abstract void open();
}</span>
<span style="font-size:14px;">package com.bridge; /**
* @author gaoxu
* 实践出真知! */
public class BMWVehicle extends AbstractVehicleBrand{
//导航
INavigator navigator = null; @Override
public void install(INavigator n) { navigator = n;
} @Override
public void open() {
navigator.work();
} }
package com.bridge; /**
* @author gaoxu
* 实践出真知!
*/
public class BenzVehicle extends AbstractVehicleBrand{
//导航
INavigator navigator = null;
@Override
public void install(INavigator n) {
navigator = n;
} @Override
public void open() {
navigator.work();
} }
导航插件的公共接口,定义了导航的行为方法。
package com.bridge; /**
* @author gaoxu
* 实践出真知!
*/
public interface INavigator {
public void work();
}
package com.bridge; public class SXZNavigator implements INavigator{ @Override
public void work() {
System.out.println("我是神行者导航。");
} }
package com.bridge; public class BDNavigator implements INavigator{ @Override
public void work() {
System.out.println("我是北斗导航!");
}
}
我们来看client代码
package com.bridge; public class Client {
public static void main(String[] para){
//我们如今是实现不同品牌的汽车,能够安装不同牌子的导航,也就是把汽车和导航聚合了起来。 //我们是通过桥接的方式完毕了这样的聚合。桥接方式比继承的方式要更灵活,它是汽车与配件可
以独立各自的发展。 //我们能够实现的聚合关系:宝马+北斗,宝马+神行者,奔驰+北斗。奔驰+身形者
//当然我们还能够给汽车配置很多其它不同的后装配件比如:空气净化器等。 INavigator bdNavigator = new BDNavigator();
INavigator sxzNavigator = new SXZNavigator();
//宝马安装北斗导航
AbstractVehicleBrand bmw = new BMWVehicle();
bmw.install(bdNavigator);
bmw.open();
//奔驰安装了神行者导航
AbstractVehicleBrand benz = new BMWVehicle();
benz.install(sxzNavigator);
benz.open();
}
}
长处:把两种都具有变化的分类实现独立变化,真的是松耦合的典范。
使用范围:多个具有变化的分类共同实现功能时易採用桥接模式。
跟着实例学习设计模式(9)-桥接模式bridge(结构型)的更多相关文章
- Java设计模式13:常用设计模式之桥接模式(结构型模式)
1. Java之桥接模式(Bridge Pattern) (1)概述: 首先我们说一个生活中的例子: 就拿汽车在路上行驶的来说.即有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也 ...
- 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
桥接模式Bridge Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来 意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展. 意图解析 依赖倒置原 ...
- 设计模式07: Bridge 桥接模式(结构型模式)
Bridge 桥接模式(结构型模式) 抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象. 抽象B稳定,实现细节b变化 问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办? ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 设计模式 笔记 桥接模式 Bridge
//---------------------------15/04/15---------------------------- //Bridge 桥接模式----对象结构型模式 /* 1:意图:将 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 结构型设计模式之桥接模式(Bridge)
结构 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. ...
- [设计模式] 7 桥接模式 bridge
#include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...
随机推荐
- 通过sql查询rman备份信息
通过sql查询rman备份信息 查看所有备份集 SELECT A.RECID "BACKUP SET", A.SET_STAMP, DECODE (B.INCREMENTAL_LE ...
- 设计模式(一)单例模式:2-懒汉模式(Lazy)
思想: 相比于饿汉模式,懒汉模式实际中的应用更多,因为在系统中,“被用到时再初始化”是更佳的解决方案. 设计思想与饿汉模式类似,同样是持有一个自身的引用,只是将 new 的动作延迟到 getinsta ...
- iOS开发UI篇—自定义layer
一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的DrawRect:方法,然后在该方法中画图. 绘制图形的步骤: ...
- 编译静态库tinyxml2
tinyxml的makefile文件默认是编译可执行的二进制文件xmltest. 需要改成静态库. 更改OUTPUT := xmltest 为:OUTPUT := libtinyxml.a 删除SR ...
- hashcode和equals方法
转自https://www.cnblogs.com/keyi/p/7119825.html 一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类 ...
- [AGC004D] Teleporter(贪心+)
Description 维尼管辖的领土很大,我们可以抽象为n个城市,其中1号点为首都.这n个城市之有n条单向电缆,一条信息经过一条电缆进行传输所需时间会+1s,然而维尼并不能忍受时间白白被续,他要求从 ...
- POJ3104 Drying
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13703 Accepted: 3527 Description It i ...
- 洛谷P1966 火柴排队[NOIP提高组2013]
我确信我应该是做过这道题……就当再写一遍好了. 贪心思想,一番证明得出a和b数组中最小对最小,次小对次小……时解最优.那么先处理出a,b之间的对应关系,然后按照该关系求a或者b的逆序对数量就是答案 / ...
- 【CF1043B】Lost Array(枚举)
题意:给定n与数组a,求所有的k使得存在x数组能按以下规则构造出a n<=1e3,a[i]<=1e6 思路: #include<cstdio> #include<cstr ...
- *UOJ#223. 【NOI2016】国王饮水记
$n \leq 8000$的数列,问不超过$m \leq 1e9$次操作后第一个数字最大是多少.操作:选一些数,把他们变成他们的平均值.需要保留$p \leq 3000$位小数,提供了一个小数高精度库 ...