Bridge模式定义 :
将抽象和行为划分开来,各自独立,但能动态的结合。
任何事物对象都有抽象和行为之分,例如人,人是一种抽象,人分男人和女人等;人有行为,行为也有各种具体表现,所以,“人”与“人的行为”两个概念也反映了抽象和行为之分。
在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是包含在一个对象中,但是,在有的情况下,我们需要将这些行为也进行归类,形成一个总的行为接口,这就是桥模式的用处。
为什么使用?
不希望抽象部分和行为有一种固定的绑定关系,而是应该可以动态联系的。
如果一个抽象类或接口有多个具体实现(子类、concrete subclass),这些子类之间关系可能有以下两种情况:
1. 这多个子类之间概念是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形桩;这两个形状上的桩是并列的,没有概念上的重复。
2.这多个子类之中有内容概念上重叠.那么需要我们把抽象共同部分和行为共同部分各自独立开来,原来是准备放在一个接口里,现在需要设计两个接口:抽象接口和行为接口,分别放置抽象和行为.
例如,一杯咖啡为例,子类实现类为四个:中杯加奶、大杯加奶、 中杯不加奶、大杯不加奶。
但是,我们注意到:上面四个子类中有概念重叠,可从另外一个角度进行考虑,这四个类实际是两个角色的组合:抽象 和行为,其中抽象为:中杯和大杯;行为为:加奶 不加奶(如加橙汁 加苹果汁).
实现四个子类在抽象和行为之间发生了固定的绑定关系,如果以后动态增加加葡萄汁的行为,就必须再增加两个类:中杯加葡萄汁和大杯加葡萄汁。显然混乱,扩展性极差。
那我们从分离抽象和行为的角度,使用Bridge模式来实现。
如何实现?
以上面提到的咖啡 为例. 我们原来打算只设计一个接口(抽象类),使用Bridge模式后,我们需要将抽象和行为分开,加奶和不加奶属于行为,我们将它们抽象成一个专门的行为接口.
先看看抽象部分的接口代码:
public abstract class Coffee { CoffeeImp coffeeImp;
public void setCoffeeImp() { this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp(); }
public CoffeeImp getCoffeeImp() {return this.CoffeeImp;}
public abstract void pourCoffee(); }
|
其中CoffeeImp 是加不加奶的行为接口,看其代码如下:
public abstract class CoffeeImp { public abstract void pourCoffeeImp(); }
|
现在我们有了两个抽象类,下面我们分别对其进行继承,实现concrete class:
//中杯 public class MediumCoffee extends Coffee { public MediumCoffee() {setCoffeeImp();}
public void pourCoffee() { CoffeeImp coffeeImp = this.getCoffeeImp(); //我们以重复次数来说明是冲中杯还是大杯 ,重复2次是中杯 for (int i = 0; i < 2; i++) {
coffeeImp.pourCoffeeImp(); } } }
//大杯 public class SuperSizeCoffee extends Coffee { public SuperSizeCoffee() {setCoffeeImp();}
public void pourCoffee() { CoffeeImp coffeeImp = this.getCoffeeImp(); //我们以重复次数来说明是冲中杯还是大杯 ,重复5次是大杯 for (int i = 0; i < 5; i++) {
coffeeImp.pourCoffeeImp(); } } }
|
上面分别是中杯和大杯的具体实现.下面再对行为CoffeeImp进行继承:
//加奶 public class MilkCoffeeImp extends CoffeeImp { MilkCoffeeImp() {}
public void pourCoffeeImp() { System.out.println("加了美味的牛奶"); } }
//不加奶 public class FragrantCoffeeImp extends CoffeeImp { FragrantCoffeeImp() {}
public void pourCoffeeImp() { System.out.println("什么也没加,清香"); } }
|
Bridge模式的基本框架我们已经搭好了,别忘记定义中还有一句:动态结合,我们现在可以喝到至少四种咖啡:
1.中杯加奶
2.中杯不加奶
3.大杯加奶
4.大杯不加奶
看看是如何动态结合的,在使用之前,我们做个准备工作,设计一个单态类(Singleton)用来hold当前的CoffeeImp:
public class CoffeeImpSingleton { private static CoffeeImp coffeeImp;
public CoffeeImpSingleton(CoffeeImp coffeeImpIn) {this.coffeeImp = coffeeImpIn;}
public static CoffeeImp getTheCoffeeImp() { return coffeeImp; } }
|
看看中杯加奶 和大杯加奶 是怎么出来的:
//拿出牛奶
CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());
//中杯加奶
MediumCoffee mediumCoffee = new MediumCoffee();
mediumCoffee.pourCoffee();
//大杯加奶
SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();
superSizeCoffee.pourCoffee();
注意: Bridge模式的执行类如CoffeeImp和Coffee是一对一的关系, 正确创建CoffeeImp是该模式的关键。
原文网址:http://www.jdon.com/designpatterns/bridge.htm
分享到:
相关推荐
2. **BANQ**:BANQ是一家专注于USB闪存设备的厂商,其量产工具是专门针对BANQ品牌的U盘设计的,能够有效地解决该品牌U盘的故障问题。 3. **主控芯片**:U盘的核心组件之一,负责管理和控制数据读写。不同品牌和型号...
设计模式与围棋的定式有相似之处,高水平的开发者会在编码过程中自然地体现出模式的应用,而新手即使熟记各种模式,如果缺乏实际经验,可能在实战中无法有效运用。因此,积累足够的编程经验和实际项目经历对于理解和...
【BaNQ-Clipper: 自动将您的BAnQ贷款与Google日历同步】 BaNQ-Clipper是一款基于JavaScript开发的应用程序,其主要功能是帮助用户将BAnQ的贷款还款信息自动同步到Google日历中。通过这种方式,用户可以更方便地管理...
文章作者是banq(又称为板桥里人),他是一位知名的软件架构师和设计模式专家。通过这份分析报告,读者可以学习到如何在实际项目中合理运用设计模式,以及理解优秀软件系统背后的架构设计理念。 #### Jive系统概述 ...
标题中的“U盘修复神器”指的是专门用于解决U盘故障的软件工具,这类工具通常能够帮助用户修复无法识别或在磁盘管理中未显示的U盘问题。在描述中提到的情况,用户表示自己的U盘在电脑上无法正常识别,甚至在磁盘管理...
在描述中提到的“很简单的移动设备写保护开关”,意味着这种功能设计简洁,易于理解和操作。当写保护开关开启时,任何尝试向优盘写入数据的操作都会被阻止,从而保护了存储在优盘内的文件不被篡改或删除。这对于保存...
U盘是由主控板+FLASH+外壳组成的,当主控板焊接上空白FLASH后插入电脑,因为没有相应的数据, 电脑只能识别到主控板,而无法识别到FLASH,所以这时候电脑上显示出U盘盘符,但是双击盘符却显示没有插入U盘,就像是...
标题中的“U盘无法格式化解决方法[录像教程]”是指一种针对计算机用户遇到的常见问题,即USB闪存驱动器(通常称为U盘)在尝试格式化时遇到障碍的解决方案。这种问题可能由多种原因引起,包括病毒感染、文件系统错误...
BanQ:一种以视频解释和代码形式同时众包算法解决方案的应用程序。 目录 建于 入门 快来了! 安装 分叉仓库 克隆仓库 git clone https://github.com/your_username_/BanQ.git 安装NPM软件包 npm install npm开始 ...
【U盘量产工具中文版】是一款专为解决MP3播放器、U盘等移动存储设备在使用过程中出现的无法读取、格式化错误等问题而设计的实用软件。它通过模拟USB设备制造商的生产过程,对U盘进行初始化、分区、格式化等一系列...
一般来说,这些工具会提供向导式的步骤,从识别设备开始,到选择操作模式,再到执行量产过程。 值得注意的是,U盘量产并非普通用户日常操作,一般适用于U盘制造商、IT维修人员或者需要大量定制U盘的组织。错误的...
SD卡格式化工具TF卡格式化工具U盘格式化单文件绿色版,直接使用无需安装
关于DDD可参考InfoQ的Mini Book Domain Driven Design Quickly , 还有 Banq 的文章 实战DDD(Domain-Driven Design领域驱动设计), 和 领域模型驱动设计(DDD)之模型提炼 。 本书分为四部分,第一部分讲述了领域模型...
标题中的“TF工具_U盘修复工具”指的是针对TF(TransFlash)卡或常见的USB闪存盘(U盘)的一种修复程序。这类工具旨在解决U盘出现的一些常见问题,如文件系统损坏、无法读取、容量显示异常等。修复工具通常会尝试对...
设备名称: [J:][G:]USB Mass Storage Device(磁盘驱动器)(Kingmax USB2.0 FlashDisk USB Device) PNP设备ID: VID = 1687 PID = 0165 设备序列号: 090402756A039B 设备版本: 0.00/0.00 设备类型: 标准USB设备 - ...
标题中的“U盘工具 量产助手”指的是用于批量生产和格式化U盘的软件工具,它可以帮助用户对多个U盘进行相同的操作,如设置启动盘、修复故障或统一格式化。在IT领域,"量产"一词通常指的是用特定工具一次性处理大量...
本资源为压缩-解压缩工具banzip,不同于其它解压-压缩工具,该软件十分轻量化,使用方便,界面简洁,功能强大,同时它最大的优点是不会随意弹窗广告,更不会捆绑安装流氓软件
例如,提供的压缩包中的“PanasonicSDFormatter”是由松下公司开发的SD卡格式化工具,专门针对其品牌的存储卡设计,但通常也兼容其他品牌。 3. **操作流程**:启动工具后,通常先要选择要处理的SD卡,然后根据软件...
JdonFramework need above jdk 1.4.0 This version has passed under Tomcat 4.x/5.x JBoss 3.x/JBoss 4.0.0 Weblogic 8.1 when build this project with eclipse or jbuilder. you need modify build.xml , ...banq
Vue的一个核心概念是遵循了MVVM(Model-View-ViewModel)模式,这种模式将应用分为三个部分: 1. Model(模型):代表数据,通常用于封装数据和定义数据的访问方法。 2. View(视图):代表用户界面,展示数据。 3. ...