索引

别名

  • 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(桥接)的更多相关文章

  1. 设计模式07: Bridge 桥接模式(结构型模式)

    Bridge 桥接模式(结构型模式) 抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象. 抽象B稳定,实现细节b变化 问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办? ...

  2. 面向对象设计模式纵横谈:Bridge 桥接模式(笔记记录)

    桥接模式是一个比较难理解的设计模式,设计和分析的时候也不容易把握,咱们听听“李建忠”老师是怎么来讲的.我们还是从演变的角度来说问题,一步一步的来把问题说清楚.先谈谈“抽象”和“实现”的关系. 抽象与实 ...

  3. 设计模式学习笔记——Bridge 桥接模式

    先说一下我以前对桥接模式的理解:当每个类中都使用到了同样的属性或方法时,应该将他们单独抽象出来,变成这些类的属性和方法(避免重复造轮子),当时的感觉是和三层模型中的model有点单相似,也就是让mod ...

  4. C++设计模式-Bridge桥接模式

    作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...

  5. 设计模式的征途—8.桥接(Bridge)模式

    在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔.假设我们需要大.中.小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支.但如果使用毛笔的话,只需要提供3 ...

  6. Bridge桥接模式(设计模式11)

    在没有使用桥接模式: 扩展新问题(类归属膨胀问题) 1增加性的电脑类型,要增加每个品牌下面的类 2如果要增加一个新的电脑品牌,要增加美中电脑类型的类 违背单一职责原则: · 一个类:联想笔记本,有两个 ...

  7. 一天一个设计模式——Bridge桥接模式

    一.概念准备 在理解桥接模式之前,先要理解面向对象程序设计中的两个概念: 类的功能层次结构:假设现在有一个类Something,这个类有一些成员属性和成员方法,但是现有的功能不能满足要求,因此我们想扩 ...

  8. 设计模式之美:Structural Patterns(结构型模式)

    结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...

  9. 设计模式之美:Type Object(类型对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...

随机推荐

  1. Fastcgi介绍和php中fastcgi的应用

    先看下FastCgi的一些解释: CGI全称是“通用网关接口”(Common Gateway Interface), 它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据. CGI描述 ...

  2. AX2012 DMF数据导入的问题

    由于AX2012的数据结构比较复杂,通过Excel直接导入表的方式很多数据已经难以导入,比如物料信息,2009只需要导入InventTable,InventTableModule和InventItem ...

  3. jquery表格增加删除后改变序号

    有个小bug,懒得修了. 目的:增加一行的时候,td第一列排序. 删除一行的时候,td第一列排序 <!DOCTYPE HTML> <html> <head> < ...

  4. nginx环境下配置nagios-关于commands.cfg

    -w $ARG1$ -c $ARG2$ -M -b% -c % -f% -c % -f% -c % -f #  define command{         command_name    chec ...

  5. JQuery 简单的文字超出部分隐藏下拉显示

    HTML代码: <body> <div class="txt_bos"><!--在每一个放置文字的class外面包一个div,以便设置动画样式用,同样 ...

  6. SVM1 线性SVM

    一.Linear Support Vector Machine 接下来的讨论假设数据都是线性可分的. 1.1 SVM的引入:增大对测量误差的容忍度 假设有训练数据和分类曲线如下图所示: 很明显,三个分 ...

  7. clone()与clone(true)的区别

    clone()方法用于复制一个元素,但是被复制出来的元素不具备复制的功能,如果希望被复制出来的元素也具备复制的功能,需要给clone()方法加上true这个参数,即clone(true). 例如: & ...

  8. nginx限制ip连接数和带宽

    今天有个人问我,nginx怎么限制ip连接数,突然想不起来了,年龄大了,脑子不怎么好使了.还要看一下配置才想起了.那个人又问我,你测试过的吗?一下子把我问蒙了,我真没测试过了,也不知道启作用了没有.下 ...

  9. laravel遇到的问题

    这是由于访问laravel项目报错的,解决几种可能出现的错误. 1)打开:D:\java\wamp\www\subway\app\config\app.php 修改:'debug' => tru ...

  10. web.py+mysql插入中文提示query = query.encode(charset) UnicodeEncodeError: 'latin-1' codec can't encode characters in position 86-100

    对于中文编码的问题,总会出现各种各样恶心的错误,还不知道应该怎么解决,首先,你从最开头就应该关注编码问题,尽量保证所有的编码方式都是一致的 用python+web.py+mysql来写程序,首先要保证 ...