`
youthon
  • 浏览: 18485 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

桥接模式和策略模式的区别

 
阅读更多

学习的过程中发现这两个概念真的是有点区分不开,尽管可以很感性的说bridge模式要比strategy模式更复杂更具可塑性,更“高级”,但是如何清晰阐述两者区别,却实是有点困难。

套用伟人的一句话,站在巨人的肩膀上看得更远,下边三段分别来自CSDN论坛的贴子和一篇blogjava的文章,看了之后令我茅塞顿开,为表尊重不在冗述,直接贴原文了。

实际上所有模式可以只分为类模式和对象模式两种,类模式是用继承而对象模式是用委托Bridge模式和Strategy模式相似就是因为他们都将任务委托给了另外一个接口的具体实现,他们之间的区别在于Bridge的目的是让底层实现和上层接口可以分别演化,从而提高移植性而Strategy的目的是将复杂的算法封装起来,从而便于替换不同的算法。因此可以想象一般情况下Bridge的实现几乎不会在运行时更改而Strategy的算法则很有可能需要在运行时更换,这就导致在细节方面需要考虑的因素可能会很不相同。

strategy模式是为了扩展和修改,并提供动态配置。它往往可以在同一环境当中使用不同的策略,就是调用不同的派生类。其内部实现是自由的,不受已有的类接口的限制(很多时候根本就不调用现成的接口)。bridge模式是往往是为了利用已有的方法或类。它将原来不统一,不兼容的接口封装起来,变成统一的接口。它的应用往往是不同的环境或平台下只能选择一 种,比如说在windows平台下只能用WinClass,而在unix平台下只能用UnixClass.它的主要作用不是配置而是定义通用接口。

据个例子来说:我要画园,要实心园,我可以用SolidPen来配置,画虚线园可以用dashedPen来配置。这是strategy模式。而同样是画园,我是在windows下来画实心园,就用windowPen+solidPen来配置,在unix下画实心园就用 unixPen+solidPen来配置。如果要再windows下画虚线园,就用windowsPen+dashedPen来配置,要在unix下画虚 线园,就用unixPen+dashedPen来配置。

我这里仅仅是就一种情况来说strategy和bridge的组合应用,其他的组合可能性随环境变化而多种多样。从中可以看出,bridge和strategy是可能组合使用,侧重不同方面的。模式某种角度上来讲就是对象组合。不要看他们都是对象组合就好像是一样的。模式的动机,意图,使用场合,组合方式,这些都是模式的一部分。其中细微的不同足以区分不同的模式。

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式。以下是它们的UML结构图。

在桥接模式中,Abstraction通过聚合的方式引用Implementor。

从桥接模式与策略模式谈起 - 一半是火焰,一半是海水 - BlogJava - silence - 守望者

在策略模式中,Context也使用聚合的方式引用Startegy抽象接口。

从桥接模式与策略模式谈起 - 一半是火焰,一半是海水 - BlogJava - silence - 守望者

从他们的结构图可知,在这两种模式中,都存在一个对象使用聚合的方式引用另一个对象的抽象接口的情况,而且该抽象接口的实现可以有多种并且可以替换。可以说两者在表象上都是调用者与被调用者之间的解耦,以及抽象接口与实现的分离。

那么两者的区别体现在什么地方呢?

1. 首先,在形式上,两者还是有一定区别的,对比两幅结构图,我们可以发现,在桥接模式中不仅Implementor具有变化 (ConcreateImplementior),而且Abstraction也可以发生变化(RefinedAbstraction),而且两者的变化 是完全独立的,RefinedAbstraction与ConcreateImplementior之间松散耦合,它们仅仅通过Abstraction与 Implementor之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性。

2. 其次在语意上,桥接模式强调Implementor接口仅提供基本操作,而Abstraction则基于这些基本操作定义更高层次的操作。而策略模式强调 Strategy抽象接口的提供的是一种算法,一般是无状态、无数据的,而Context则简单调用这些算法完成其操作。

3.桥接模式中不仅定义Implementor的接口而且定义Abstraction的接口,Abstraction的接口不仅仅是为了与 Implementor通信而存在的,这也反映了结构型模式的特点:通过继承、聚合的方式组合类和对象以形成更大的结构。在策略模式中,Startegy 和Context的接口都是两者之间的协作接口,并不涉及到其它的功能接口,所以它是行为模式的一种。行为模式的主要特点就是处理的是对象之间的通信方 式,往往是通过引入中介者对象将通信双方解耦,在这里实际上就是将Context与实际的算法提供者解耦。

所以相对策略模式,桥接模式要表达的内容要更多,结构也更加复杂。桥接模式表达的主要意义其实是接口隔离的原则,即把本质上并不内聚的两种体系区别 开来,使得它们可以松散的组合,而策略在解耦上还仅仅是某一个算法的层次,没有到体系这一层次。从结构图中可以看到,策略的结构是包容在桥接结构中的,桥 接中必然存在着策略模式,Abstraction与Implementor之间就可以认为是策略模式,但是桥接模式一般Implementor将提供一系 列的成体系的操作,而且Implementor是具有状态和数据的静态结构。而且桥接模式Abstraction也可以独立变化。

参考文献:blogjava的一篇博文csdn论坛

原文地址:http://hi.baidu.com/%C7%C7%C4%BE%BA%CD%D0%A1%C7%C7/blog/item/2b22631d0a2c13c3a6866904.html


分享到:
评论

相关推荐

    桥接模式和策略模式的区别,内含可运行代码和两者详细区别

    桥接模式和策略模式是软件设计模式中的两种重要模式,它们在实现上有着相似之处,但各自的应用场景和设计理念有所不同。下面将详细阐述这两种模式的特点、区别以及它们在实际编程中的应用。 首先,桥接模式(Bridge...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是面向对象设计中的一种结构型模式,它将抽象部分与实现...在实际开发中,特别是在处理有多种变体和组合的场景下,如图形绘制、设备驱动、软件配置等,桥接模式都是一种非常实用的设计策略。

    Android桥接模式demo

    桥接模式在Android开发中提供了一种高效的设计策略,有助于降低代码的复杂性,提高可维护性和可扩展性。通过`ImplementorDemo`的例子,我们可以看到如何使用桥接模式来分离动画效果的抽象和实现,使其能独立变化,...

    JAVA_Strategy.rar_java 策略模式、工厂模式、桥接模式_severalgdo_strategy

    在软件设计模式的世界里,Java 语言提供了丰富的工具来实现各种设计模式,如标题和描述中提到的策略模式、工厂模式以及桥接模式。这些模式是面向对象设计的重要组成部分,帮助开发者解决复杂的问题,提高代码的灵活...

    海尔(Haier)、TCL、海信(Hisense)桥接模式

    在这个场景中,我们看到“海尔(Haier)、TCL、海信(Hisense)”这三个品牌可能被用作具体实现的示例,而桥接模式则作为设计策略来帮助这些品牌的产品(比如智能家电)实现灵活的扩展和互操作性。 桥接模式的核心思想...

    iOS 设计模式 桥接模式

    在实际的iOS项目中,桥接模式可以应用于各种场景,比如视图组件的定制、数据访问策略的切换或者网络请求的封装等。例如,你可以创建一个网络请求抽象类,定义基本的请求方法,然后根据不同的网络库(如AFNetworking...

    设计模式之桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件设计中常...在面对需要支持多种实现策略或需要独立扩展抽象和实现的场景时,桥接模式是一个值得考虑的设计模式。

    简单了解C#设计模式编程中的桥接模式

    桥接模式是一种结构型设计模式,它旨在将抽象部分与实现部分分离,使得两者能够独立地进行变化。在C#编程中,桥接模式...在C#编程中,尤其是在需要解耦逻辑层和数据操作层的场景,桥接模式是一个值得考虑的设计策略。

    桥接模式-代理-iOS

    比如,一个自定义的视图控件可能需要多种绘制风格,这时候可以通过桥接模式来实现,视图控件作为抽象部分,具体的绘制策略作为实现部分。同时,为了控制视图的行为,如用户交互,我们可以使用代理模式来定义一套协议...

    第十五讲:桥接模式

    通过桥接模式,我们可以将抽象类和实现类解耦,使得系统更加灵活,易于扩展。 桥接模式的核心组成部分包括抽象接口(Abstraction)、具体抽象类(Concrete Abstraction)、实现接口(Implementor)和具体实现类...

    JAVA桥接模式.doc

    桥接模式通过引入抽象层和实现层的概念来解决这个问题。抽象层代表图形,实现层代表颜色。抽象层与实现层通过组合的方式关联,而不是通过继承。这样,即使图形和颜色的种类增加,也不需要创建新的类,只需要增加新的...

    桥接(bridge)模式

    例如,Ant或Maven的构建配置文件(如build.xml)可以看作是桥接模式的一种体现,它们允许开发者选择不同的构建目标和执行策略,而这些策略可以通过插件系统实现。 文件列表中的".classpath"和".project"是Java ...

    解决桥接不能分配Ip问题

    其中一种常见的问题是,在使用桥接模式时,Red Hat系统无法正常获得IP地址,从而导致无法独立访问互联网。本文将深入探讨这一问题的原因,并提供解决方案。 #### 桥接模式简介 桥接(Bridged)是一种常见的虚拟机...

    python 项目里常用的设计模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式 简单工厂 建造者模式 模板模式

    python 项目里常用的设计模式 单例模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式简单工厂 建造者模式 模板模式 桥接多维度 桥接模式 适配器模式 外观模式 享元模式 责任链组合模式

    《Java设计模式》电子课件01至21章(程细柱PDF)

    内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象...4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): ...策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等

    抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子模式、中介者模式、备忘录模式、...

    vmnetcfg vmware 桥接 配置工具

    4. **网络策略**:有些企业网络可能不允许非物理设备直接连接到网络,使用桥接模式前需了解并遵守网络策略。 5. **更新和兼容性**:随着VMware软件版本的更新,vmnetcfg工具也可能会有变化。确保使用与当前VMware...

    设计模式-C++

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

Global site tag (gtag.js) - Google Analytics