跟着实例学习设计模式(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 ...
随机推荐
- Strut 2 ValueStack传送带机制
源码与jar包下载(将rar改成jar,直接放在WEB_INF\lib目录中即可) 众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数.Action配置参数.向其他 ...
- http的一些知识
TCP/IP协议分层 应用层 TFP DNS DNS域名解析的过程 在浏览器DNS缓存中搜索 读取系统的hosts文件,查找其中是否有对应的ip 向本地配置的首选DNS服务器发起域名解析请求 HTTP ...
- [AGC004D] Teleporter [贪心]
题面: 传送门 思路: 分析可知,这道题中的图是一个环套内向树,首都在环上 首先有一个结论:当首都的出边指向首都时,一定最优(不然首都出发可能无法按时到达首都)(可以按时到达的情况也一定有到不了的) ...
- wewe
<#assign base=rc.contextPath /> <#import "spring.ftl" as s /> <!DOCTYPE htm ...
- bzoj1093【ZJOI2007】最大半联通子图
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1093 sol :一开始理解错题意了QAQ,还莫名其妙写挂了QAQ,调了半天 首先显然一个强联 ...
- java拼接字符串用StringBuilder
StringBuilder builder = new StringBuilder(); String s1="abc"; for(int i=0;i<10000000;i+ ...
- 心跳 CSS
生活中我们所见到的大部分图形(正方形.长方形.圆形.椭圆.三角形.多边形...)都是可以用css3来实现,以及一些复杂点的图形——其实都是由基本图形组合而成的. 由于明天就是情人节了,所以今天我们就用 ...
- 江南乐(bzoj 3576)
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一 ...
- Python与其他语言时间戳
时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数.它也被称为 Unix 时间戳(Unix Timestamp). Unix时间戳(Unix timestamp),或称Un ...
- BZOJ【1606】购买干草
1606: [Usaco2008 Dec]Hay For Sale 购买干草 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 859 Solved: 63 ...