`

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

阅读更多
学习的过程中发现这两个概念真的是有点区分不开,尽管可以很感性的说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也可以独立变化。
分享到:
评论

相关推荐

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

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

    吉林大学软件设计模式练习题

    // 一套秋季校服含一件长袖上衣和一条秋季长裤,一套夏季校服含一件短袖衬衣、一件短袖 T 恤、一条夏季长裤和一条短裤。 // 不同学校校服款式不同。请设计一个子系统为三所学校(一中、二中、三中)分别生产秋季校服...

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

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

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

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

    23种设计模式详解PDF

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

    java 23种设计模式.zip

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

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

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

    vmnetcfg vmware 桥接 配置工具

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

Global site tag (gtag.js) - Google Analytics