跟着实例学习设计模式(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 ...
随机推荐
- File IO(NIO.2):文件操作
简介 Files类是java.nio.file包的另一个主要入口点.该类提供了一组丰富的静态方法,用于读取,写入和操作文件和目录.Files方法适用于Path对象的实例.在进行其余部分之前,您应该熟悉 ...
- bable
Babel是一个javascrpt编译器,能将es6转换为es5代码.并且通过插件的形式可以灵活的扩展. 从根目录读取.babelrc文件中读取配置..babelrc是一个json文件 配置 plug ...
- 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...
- Codeforces 1158C Permutation recovery
https://codeforces.com/contest/1158/problem/C 题目 已知 $p_1, p_2, \dots, p_n$ 是 $1$ 到 $n$ 的一个排列. 给出关于这个 ...
- Beads
Beads 题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不 ...
- android2.2 watchdog分析
1 watchdog分析 Watchdog就是“看门狗”.其最初存在的意义是因为以前嵌入式设备上的程序经常跑飞(电磁干扰之类的),所以专门设置了一个硬件看门狗,每个一段时间,看门狗就去检查一下某个参数 ...
- 移动端px转rem的两种方法
rem使用方法: rem ,root element,即相对于根元素的大小,浏览器默认字符大小为16px,此时1rem相当于16px. 方法1 设置font-size: body{font-size ...
- react 基础语法复习3- 数据传递 & 数据变化(props&&state)
react当中的数据传递是通过 props以及 state来实现的 props <Header name="kugeliu" /> Header组件当中有个name属性 ...
- Gate Of Babylon(bzoj 1272)
Description Input Output Sample Input Sample Output 12 HINT /* 容斥+lucas+乘法逆元 首先,看到有限制的只有15个,因此可以用容斥原 ...
- 【HDOJ5512】Pagodas(数论)
题意:给定n,a,b,一开始集合里面有两个数:a和b,然后两个人轮流往这个集合里面增加数字 增加数字的原则是:这个集合里面任选两个数的和或差(a + b或a - b或b -a的中的任意一个没被选中的属 ...