设计模式(九)Bridge模式
Bridge模式就是将类的功能层次结构和类的实现层次结构连接起来。
类的功能层次结构就是根据实际非抽象类来说的,也就是父类具有基本功能,然后在子类中增加新功能。用于增加新功能。
类的实现层次结构就是根据抽象类来说的,也就是父类通过声明抽象方法来定义接口,子类通过实现具体方法来实现接口。用于增加新实现。
package bigjunoba.bjtu.function;
import bigjunoba.bjtu.implement.DisplatImpl;
public class Display {
private DisplatImpl impl;
public Display(DisplatImpl impl) {
this.impl = impl;
}
public void open() {
impl.rawOpen();
}
public void pring() {
impl.rawPrint();
}
public void close() {
impl.rawClose();
}
public final void display() {
open();
pring();
close();
}
}
Display类位于“类的功能层次结构”的最上层。这里的原理和Builder模式比较一下还是有点相似的。DisplatImpl类是个抽象类,定义了三个抽象方法。同样的Display类通过构造函数将DisplatImpl类传递进来,由于抽象类不能被实例化,因此传递进来的也就是DisplatImpl的子类,并保存在impl字段中。impl字段就是类的两个层次结构的“桥梁”。
package bigjunoba.bjtu.function;
import bigjunoba.bjtu.implement.DisplatImpl;
public class CountDisplay extends Display{
public CountDisplay(DisplatImpl impl) {
super(impl);
}
public void multiDisplay(int times) {
open();
for (int i = 0; i < times; i++) {
pring();
}
close();
}
}
CountDisplay类位于“类的功能层次结构”的最下层。CountDisplay类继承了Display类,用于在Display类的基础上增加一个新功能。首先通过构造器调用父类的构造函数,然后multiDisplay方法用来增加新的功能。
下面来看一下“类的实现层次结构”部分。也就是桥的另外一侧。
package bigjunoba.bjtu.implement;
public abstract class DisplatImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
DisplatImpl位于“类的实现层次结构”的最上层。声明了三个抽象方法。
package bigjunoba.bjtu.implement;
public class StringDisplayImpl extends DisplatImpl{
private String string;
private int width;
public StringDisplayImpl(String string) {
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void rawOpen() {
printLine();
}
@Override
public void rawPrint() {
System.out.println("|" + string + "|");
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
StringDisplayImpl类位于“类的实现层次结构”的最下层。作为DisplatImpl类的子类,用来实现DisplatImpl类的三个抽象方法。
package bigjunoba.bjtu.test; import bigjunoba.bjtu.function.CountDisplay;
import bigjunoba.bjtu.function.Display;
import bigjunoba.bjtu.implement.StringDisplayImpl; public class Main { public static void main(String[] args) {
Display display1 = new Display(new StringDisplayImpl("Lianjiang"));
Display display2 = new CountDisplay(new StringDisplayImpl("Lianjiangjiang"));
CountDisplay countDisplay = new CountDisplay(new StringDisplayImpl("Lianjiangjiangjiang"));
display1.display();
display2.display();
countDisplay.display();
countDisplay.multiDisplay(5);
}
}
Main类作为测试类,这里需要好好理解一下。这三个实例的创建都是先向StringDisplayImpl类传递一个String类型的字符串,然后通过StringDisplayImpl类的构造器生成的对应的三个实例。display1字段保存的是Display类的构造器通过接受DisplayImpl抽象类的子类生成的实例也就是impl,然后生成了Display类的实例。display2字段保存的是具有新功能的Display类的实例。而countDisplay字段保存的也是具有新功能的CountDisplay类的实例,由于CountDisplay类是Display类的子类,本质上来说还是属于Display类的实例,说白了就是既可以调用Display类的基本功能,也可以调用CountDisplay类的新功能。
+---------+
|Lianjiang|
+---------+
+--------------+
|Lianjiangjiang|
+--------------+
+-------------------+
|Lianjiangjiangjiang|
+-------------------+
+-------------------+
|Lianjiangjiangjiang|
|Lianjiangjiangjiang|
|Lianjiangjiangjiang|
|Lianjiangjiangjiang|
|Lianjiangjiangjiang|
+-------------------+
输出结果是这样的。结合上述分析来看就很明显了。
下面是Bridge模式的类图。

这里就不解释了。结合示例程序看就很容易理解。要强调的一点是,如果想要增加功能,只需要在“类的功能层次结构”一侧增加类即可,而“类的实现层次结构”不需要做任何改变,最关键的是,增加后的功能可以被“所有的实现”使用。
扩展部分:继承和委托。
继承是一种强关联关系。通俗来说,就是如果不修改代码,那么就很难改变子类和父类之间的关系。
委托是一种弱关联关系。例如,示例中,Display类的impl字段保存了实现的实例,这样类的任务就发生了转移,比如调用open方法就会调用impl.rawOpen方法,也就是如果想让Display类工作,这个时候Display类就不自己工作,而是交给impl,让impl去工作。这就是“委托”。更加深入地理解,弱关联是因为,只有Display类的实例生成时,才与作为参数被传入的类构成关联。示例中的Main类,只有生成DIsplay类和CountDisplay类的实例时,才将StringDisplayImpl的实例作为参数传递给Display类和CountDisplay类。还有一个优点就是,如果新加了一个实现,就是讲其他ConcreteImplementor类的实例传递给Display类和CountDisplay类时也可以轻松实现,而其他Display类和DisplayImpl类不需要做任何改变,也就是上面强调的,如果想要增加功能,只需要在“类的功能层次结构”一侧增加类即可,而“类的实现层次结构”不需要做任何改变,最关键的是,增加后的功能可以被“所有的实现”使用。总结来说,这种模式的优点就是,有利于独立地对它们进行扩展。
设计模式(九)Bridge模式的更多相关文章
- 【设计模式】Bridge模式(桥接模式)
最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...
- 设计模式之——bridge模式
Bridge模式,又叫桥接模式,是针对同一接口进行扩展与实现操作的一种设计模式. 这种模式,与之前学过的适配器模式具有相似的地方,也有不同的地方,下面就让我们一一解析吧. 首先,我们要了解到,为什么需 ...
- Java设计模式---桥接Bridge模式
参考于 : 大话设计模式 马士兵设计模式视频 写在开头: 桥接模式主要用于一件事物分成了两个维度,进行排列组合,比如礼物,可以分成优雅的礼物(抽象),花(具体),排列组合优雅的花! 1.为什么使用桥接 ...
- 设计模式--桥接(Bridge)模式
1.概述: 桥接模式:把抽象和行为分离开来,中间需要某个介质来连接抽象化和行为化.此模式的概述听起来非常像适配器模式,不要搞混了,虽然都是借用中间介质,但意义不同.最典型的桥接模式就是:JDBC.通过 ...
- 设计模式:bridge模式
目的:将“类的功能层次结构”和“类的实现层次结构”分类 类的功能层次:通过类的继承添加功能(添加普通函数) 类的实现层次:通过类的继承实现虚函数 理解:和适配器模式中的桥接方法相同 例子: class ...
- java面试题之----jdbc中使用的设计模式(桥接模式)
1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...
- [设计模式] 7 桥接模式 bridge
#include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
随机推荐
- FlagCounter被封杀?自己实现一个简单的多国访客计数器
起因 前段时间发现博客右边的FlagCounter计数器突然没了,又看到了博客园封杀了FlagCounter的消息,有点摸不着头脑.于是上FlagCounter的网站上看了一眼,发现最近出现的来自新国 ...
- selenium--定位--CSS
大家在使用selenium元素定位的时候,通常更多使用的是XPATH,css定位方式用得比较少 但有时候css定位方式还是有一些优势的, 优势1:一般情况下定位速度要比XPATH快 优势2:语法要比X ...
- Anaconda基本认识
Anaconda Distribution是执行Python数据科学和机器学习最简单的方法. 它包括250多种流行的数据科学软件包,以及适用于Windows,Linux和MacOS的conda软件包和 ...
- vue-router路由元信息及keep-alive组件级缓存
路由元信息?(黑人问号脸???)是不是这么官方的解释很多人都会一脸懵?那么我们说meta,是不是很多人恍然大悟,因为在项目中用到或者看到过呢? 是的,路由元信息就是我们定义路由时配置的meta字段:那 ...
- Java面向对象笔记(五分钟秒懂)
面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...
- springboot 集成druid
1.druid简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...
- 【SQL server基础】SQL存储过程和函数的区别
本质上没区别.只是函数有如:只能返回一个变量的限制.而存储过程可以返回多个.而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行.执行的本质都一样. 函数限制比较多,比 ...
- Win10下80端口被System占用导致Apache无法启动
Windows10下80端口被PID为4的System占用导致Apache无法启动的分析与解决方案 方法/步骤 最近更新了Windows10,总体上来说效果还是蛮不错的,然而今天在开启Apac ...
- ng form组件(表单)
tip: 数据的双向绑定(数据的双向绑定只是针对表单) 实现数据的双向绑定需要在app_module.ts(根模块)中进行注册一些东西 import {FormsModule} from '@angu ...
- Javascript中Promise的简单使用
// 函数功能:1秒以后创建一个10以内的随机整数,并判断这个数是否为偶数:如果是偶数则做一件事情,如果是奇数则做另一件事情 function doSomthing() { var promise = ...