设计模式之美:Bridge(桥接)
索引
别名
- Handle
- Body
意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Decouple an abstraction from its implementation so that the two can vary independently.
结构
参与者
Abstraction
- 定义抽象类的接口。
- 维护一个指向 Implementor 类型对象的指针。
RefinedAbstraction
- 扩充由 Abstraction 定义的接口。
Implementor
- 定义实现类的接口,该接口不一定要与 Abstraction 接口完全一致,甚至可以完全不同。
- Implementor 接口仅提供基本操作,Abstraction 则定义了基于这些基本操作的较高层次的操作。
ConcreteImplementor
- 实现 Implementor 接口并定义它的具体实现。
适用性
在以下情况下可以使用 Bridge 模式:
- 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。比如需要在程序运行时刻实现部分应可以被选择或者切换。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
- 你想对客户完全隐藏抽象的实现部分。
- 类的层次需要将一个对象分解成两个部分。
- 你想在多个对象间共享实现,但同时要求客户并不知道这一点。
效果
- 分离接口及其实现部分。
- 提高可扩充性。
- 实现细节对客户透明。
相关模式
- Abstract Factory 模式可以用来创建和配置一个特定的 Bridge 模式。
- Adaptor模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。Bridge 模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。
- Bridge 模式的结构与对象 Adapter 模式类似,但是 Bridge 模式的出发点不同:Bridge 目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而 Adapter 则意味着改变一个已有对象的接口。
实现
实现方式(一):使用 Bridge 模式分离抽象部分和实现部分。
当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。
但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。
使用 Bridge 模式,它在抽象类与它的实现直接起到了桥梁作用,使它们可以独立地变化。
namespace BridgePattern.Implementation1
{
public class Abstraction
{
protected IImplementor _implementor; public Abstraction(IImplementor implementor)
{
_implementor = implementor;
} public virtual void Operation()
{
_implementor.OperationImp1();
}
} public interface IImplementor
{
void OperationImp1();
} public class ConcreteImplementorA : IImplementor
{
public void OperationImp1()
{
// do something
}
} public class ConcreteImplementorB : IImplementor
{
public void OperationImp1()
{
// do something
}
} public class ChildAbstraction : Abstraction
{
public ChildAbstraction(IImplementor implementor)
: base(implementor)
{
} public override void Operation()
{
base.Operation();
// do some others
}
} public class Client
{
public void TestCase1()
{
IImplementor implementor1 = new ConcreteImplementorA();
IImplementor implementor2 = new ConcreteImplementorB(); Abstraction abstraction1 = new Abstraction(implementor1);
Abstraction abstraction2 = new ChildAbstraction(implementor2); abstraction1.Operation();
abstraction2.Operation();
}
}
}
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Bridge(桥接)的更多相关文章
- 设计模式07: Bridge 桥接模式(结构型模式)
Bridge 桥接模式(结构型模式) 抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象. 抽象B稳定,实现细节b变化 问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办? ...
- 面向对象设计模式纵横谈:Bridge 桥接模式(笔记记录)
桥接模式是一个比较难理解的设计模式,设计和分析的时候也不容易把握,咱们听听“李建忠”老师是怎么来讲的.我们还是从演变的角度来说问题,一步一步的来把问题说清楚.先谈谈“抽象”和“实现”的关系. 抽象与实 ...
- 设计模式学习笔记——Bridge 桥接模式
先说一下我以前对桥接模式的理解:当每个类中都使用到了同样的属性或方法时,应该将他们单独抽象出来,变成这些类的属性和方法(避免重复造轮子),当时的感觉是和三层模型中的model有点单相似,也就是让mod ...
- C++设计模式-Bridge桥接模式
作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...
- 设计模式的征途—8.桥接(Bridge)模式
在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔.假设我们需要大.中.小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支.但如果使用毛笔的话,只需要提供3 ...
- Bridge桥接模式(设计模式11)
在没有使用桥接模式: 扩展新问题(类归属膨胀问题) 1增加性的电脑类型,要增加每个品牌下面的类 2如果要增加一个新的电脑品牌,要增加美中电脑类型的类 违背单一职责原则: · 一个类:联想笔记本,有两个 ...
- 一天一个设计模式——Bridge桥接模式
一.概念准备 在理解桥接模式之前,先要理解面向对象程序设计中的两个概念: 类的功能层次结构:假设现在有一个类Something,这个类有一些成员属性和成员方法,但是现有的功能不能满足要求,因此我们想扩 ...
- 设计模式之美:Structural Patterns(结构型模式)
结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...
- 设计模式之美:Type Object(类型对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...
随机推荐
- HttpURLConnection下载图片的两种方式
public class MainActivity extends AppCompatActivity { private ImageView iv; private String imageurl ...
- 关于Nios II的启动分析(转载)
原文地址:http://hi.baidu.com/goatdai/item/cc33671545d89243e75e06ad 常用到的存储器包括SDRMA.SRAM.FLASH.Onchip_memo ...
- 论垃圾邮件危害性及U-Mail邮件系统必杀技
阿里集团今年“双十一电商节”又一次突破了去年营收,创造了新的历史.相信在电商日益渗入生 活的今天,你在日常工作中一定收到过某店铺发来的推广邮件,的确,邮件如今被电商广泛应用于消费者购物各环节,但是在其 ...
- swift使用swifthttp
1.https://github.com/daltoniam/SwiftHTTP下载 2.将项目中的Source文件夹中的所有.swift拖到项目中 3.不用import 4.直接用HTTP.GET或 ...
- <img>标签
<img src="w3school.jpg" width="104" height="142" />注释:图像的名称和尺寸是以 ...
- eclipse构建及运行maven web项目
1:环境 eclipse indigo, JDK1.6, maven 3.2.1, tomcat7.0.42 2:安装eclipse maven插件 m2eclipse 第一种方法:从网上下载m2ec ...
- 最近在研究备份和虚拟磁带库(LEGATO + MHVTL + SCST + LanFree)
最近在研究备份和虚拟磁带库(LEGATO + MHVTL + SCST + LanFree) 有些小成功,MHVTL已经搞定,SCST + LANFREE 正在继续实验中,接着就是LEGATO. 最终 ...
- SD-WAN技术分析
1.概述 转载须注明来自 SDNLAB并附上本文链接. 本文链接:http://www.sdnlab.com/17810.html 宽带接入以及Internet骨干网容量的持续提升,促使企业WAN技术 ...
- NET Framework 4.0的安装失败处理
如果是XP系统,这么做:1.开始——运行——输入cmd——回车——在打开的窗口中输入net stop WuAuServ2.开始——运行——输入%windir%3.在打开的窗口中有个文件夹叫Softwa ...
- Servlet练习
编写一个Servlet,注册登录成功后,讲表单中的内容输出到页面当中 <%@ page language="java" contentType="text/html ...