设计模式之——bridge模式
Bridge模式,又叫桥接模式,是针对同一接口进行扩展与实现操作的一种设计模式。
这种模式,与之前学过的适配器模式具有相似的地方,也有不同的地方,下面就让我们一一解析吧。
首先,我们要了解到,为什么需要使用Bridge模式:
现在有一个抽象类/接口,这个抽象类是起到了一个规范的作用,规范一些方法。
示例是用来在控制台中打印输出框和字符串(规范输出)
- DisplayImpl 抽象类,规范了打印的方法
package site.wangxin520.gof.bridge; /**
* 原先需要实现/继承的类/接口
* @author wangXgnaw
*
*/
public abstract class DisplayImpl { //打开输出框
public abstract void rawOpen();
//在输出框里面打印字符串
public abstract void rawPrint();
//当打印字符串结束后,关闭输出框
public abstract void rawClose(); }
在此抽象类/当然也可以使用接口中,规定了三个抽象方法,让子类去实现具体的逻辑。
- StringDisplayImpl类,这个类是用来实现DisplayImpl中的抽象方法逻辑的。
package site.wangxin520.gof.bridge; /**
* 继承了根类,并且重写了/实现了根类中定义的方法
* @author wangXgnaw
*
*/
public class StringDisplayImpl extends DisplayImpl{ private String string;
private int width; /**
* 构造方法,传入需要规范/美化的字符串
* @param string 需要字符串
*/
public StringDisplayImpl(String string) {
this.string=string;
this.width=string.length();
} /**
* 实现父类的抽象方法,下同
*/
@Override
public void rawOpen() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
} @Override
public void rawPrint() { System.out.println("|"+string+"|"); } @Override
public void rawClose() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
System.out.println("*************************");
}
}
在这个子类中,重写了父类中规定的抽象方法。根据面向对象的程序开发原则可知:
代码对扩展开放,但对于修改闭源。
所以,我们想要扩展功能的话,都是利用继承父类,然后在子类里面去新建方法的这种模式,但这里就得注意了,我们刚开始是实现了抽象类/接口,而规定接口/抽象类就是为了去有不同的实现逻辑,而如果再去扩展的话,就只是针对某一逻辑进行扩展,如果去扩展其他实现逻辑的话,就只能采用再去重写父类的抽象方法,再去继承来扩展。
因此,我们想到的是吧抽象类或者接口的具体实现和扩展分开来以达到扩展功能不影响实现,增加实现又不影响扩展的功能,这样就大大的简化了我们的开发。这种思想就是桥接的思想,也就是使用了bridge模式。
桥接模式和适配器模式的区别也就在此:
- 首先是两者的目的不同,桥接是为了分离接口的功能扩展和抽象方法的实现,而适配器模式是为了对同一实现提供不同接口。
- 其次是二者的实现方式不同,桥接是利用新接口去继承原先的旧接口,以此来提供新的接口给新的实现类,而桥接并不是为了改变接口,而是去为原来的接口增加功能。
下面就是具体的代码实现bridge模式:
- Display 在这个类里面,准备一个DisplayImpl抽象类的对象作为属性(利用多态,可以不用关注具体是抽象方法的哪种实现)。
package site.wangxin520.gof.bridge; /**
* 桥接用,实现功能的类
* @author wangXgnaw
*
*/
public class Display { /**
* 准备一个属性,并且在构造Display类的时候将具体实现接口的类进行传入
*/
private DisplayImpl impl;
public Display(DisplayImpl impl){
this.impl=impl;
} /**
* 扩展了原抽象方法的方法,这里就类似于适配器模式
*/
public void open(){
impl.rawOpen();
}
public void print(){
impl.rawPrint();
}
public void close(){
impl.rawClose();
} /**
* 扩展了display方法
*/
public final void display(){
open();
print();
close();
} }
- CountDisplay,扩展父类的方法
package site.wangxin520.gof.bridge; /**
* 继承了Display类,继续扩展方法
* @author wangXgnaw
*
*/
public class CountDisplay extends Display{ /**
* 利用构造,传参,与父类相同
* @param impl
*/
public CountDisplay(DisplayImpl impl) {
super(impl);
} /**
* 继续扩展了父类的方法
* @param times
*/
public void multiDisplay(int times){
open();
for (int i = 0; i < times; i++) {
print();
}
close();
} }
- 测试类:
package site.wangxin520.gof.bridge; /**
* 桥接模式的测试类
* @author wangXgnaw
*
*/
public class Test { public static void main(String[] args) {
//d1和d2都是使用了默认的display方法
Display d1=new Display(new StringDisplayImpl("Hello world"));
d1.display();
Display d2=new CountDisplay(new StringDisplayImpl("Hello mars"));
d2.display(); //d3使用的是扩展出来的multiDisplay方法,因为父类是不能找到子类的专属方法,所以这里没有采用多态的方式
CountDisplay d3=new CountDisplay(new StringDisplayImpl("Hello moon"));
d3.display();
d3.multiDisplay(3); } }
- 结果
可见,最后d3扩展出来的multiDisplay是可以展示的。
设计模式之——bridge模式的更多相关文章
- 【设计模式】Bridge模式(桥接模式)
最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...
- 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 ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- C#设计模式之八桥接模式(Bridge)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的.因为桥在我们现实 ...
- C#设计模式之七桥接模式(Bridge Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的,英文名称:Bridge Pattern.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称 ...
随机推荐
- 单片机成长之路(51基础篇) - 012 MCS-51单片机控制详解–TMOD T2MOD
TMOD:工作方式控制寄存器 寄存器地址89H,不可位寻址. 位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 GATE C/T M1 M0 GATE C/T M1 M0 GATE——门控 ...
- ListView中的item中的Onclick事件的优化
ListView的Adapter的优化布局载入器的载入次数最典型的使用方法是使用convertView进行优化,让convertView当做布局载入器的载体,也就是.重用 convertView 用以 ...
- Base标签小记:更改当前页面的地址
一般来说,H5游戏的部署,index.html和代码资源都会放在同一个地址下然后使用iFrame导入到需要加载游戏的页面即可. 但是今天游戏项目部署遇到了一个问题,游戏自己的访问页面(index.ht ...
- lombok自带的slfj使用方法
1.pom.xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...
- 【iCore4 双核心板_ARM】例程三十四:U_DISK_IAP_ARM实验——更新升级STM32
实验现象及操作说明: 1.本例程共有两个代码包,APP和IAP,IAP程序功能实现将APP程序升级至STM32中. 2.直接上电或烧写程序将执行升级的APP应用程序. 3.按下按键上电或写程序将进行升 ...
- 安装jdk配置环境变量JAVA_HOME不起作用
今天重新安装系统,需要装jdk,配置环境变量,于是先配置JAVA_HOME D:\Program Files\Java\jdk1.8.0_144, 然后在配置path路径,但是cmd到dos命令行输 ...
- dedecms调用子栏目及文章列表
使用DEDECMS程序建网站时,有些栏目下面有子栏目,我们需要在网站前台调用出子栏目以及子栏目下的文章列表. dedecms调用子栏目及文章列表可以使用以下的代码进行调用: <div class ...
- mysql主从复制-方案2
MySQL主从介绍 (两台机器数据同步) 主:-->binlog 从:-->relaylog 主上有一个log dump线程,用来和从的I/O线程传递binlog 从上有两个线程,其中I/ ...
- 误删除libc.so.6的解决
最近安装一个软件需要glibc-2.17. 使用ldd --version 发现系统的glibc版本为 glibc-2.12,当时没有想到更好的方法,就尝试将系统的glibc版本修改为glibc-2. ...
- MQTT 嵌入式端通讯协议解析(转)
MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet.百度的云平台也都支持MQTT的接入.虽然MQTT很火,但是目前对 ...