博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js设计模式 --- 策略设计模式
阅读量:6673 次
发布时间:2019-06-25

本文共 1493 字,大约阅读时间需要 4 分钟。

策略设计模式

Strategy模式是一种行为型设计模式,它将算法一个个封装起来,在某一时刻能够互换地使用其中的一个算法。从概念上看,所有这些算法完成的都是相同的工作,只是实现不同而已.
它的实现形式和桥接设计模式非常的相似, 只不过动机不同, 一些细节不同而已
下面来看两种模式的结构图
  • 桥接模式
    图片描述
  • 策略模式
    同样,Context也会包含一个指向Strategy对象的指针,使得Context可以使用不同的策略算法,甚至Context也可以有子类,使得类图和Bridge完全一样.
    图片描述

实际上所有对原有功能拓展模式可以只分为类模式和对象模式两种,类模式是用继承而对象模式是用委托 ,Bridge模式和Strategy模式相似就是因为他们都将任务委托给了另外一个接口的具体实现。

现在看看他们的区别,搞清楚了区别,这里参考了网上一些比较经典的说明:

  • 在形式上,两者还是有一定区别的,对比两幅结构图,我们可以发现,在桥接模式中不仅行为具有变化 ,而且Abstraction也可以发生变化,而且两者的变化是完全独立的,它们仅仅通过Abstraction与 Implementor之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性,当然我们说过,其实Context也是可以子类的,这样他们再类图上就是一样的了,但是对于Strategy而言,Context的变化并不是它关心的重点。
  • 它们最重要的区别就在于Strategy里面红色的几个词,Strategy主要是封装了算法,使得算法可以动态替换,也就是说,Context中指向Strategy对象的指针的值是可以动态设定的,一般会有一个方法SetStrategy类似的方法在Context里面,所以它是一个行为模式,描述的是行为的变化;而Bridge模式中,指向行为是指针是不能改变的,它主要是要表达一个系统中的元素和行为可以单独变化,随意的组合,但一旦组合上之后是不变的,更多的是描述系统的结构,所以是一种结构模式。 很多模式的实现上都很相似,但它们的应用场景是不一样的,这才是设计模式最重要的内容,模式只是一个实现工具而已。

  • 桥接模式:不仅Implementor具有变化(ConcreteImplementor),而且Abstraction也可以发生变化(RefinedAbstraction),而且两者的变化是完全独立的,RefinedAbstraction与ConcreateImplementor之间松散耦合,它们仅仅通过Abstraction与Implementor之间的关系联系起来。强调Implementor接口仅提供基本操作,而Abstraction则基于这些基本操作定义更高层次的操作。
  • 策略模式:并不考虑Context的变化,只有算法的可替代性。强调Strategy抽象接口的提供的是一种算法,一般是无状态、无数据的,Context简单调用这些算法完成其操作。
  • 所以相对策略模式,桥接模式要表达的内容要更多,结构也更加复杂。
  • 桥接模式表达的主要意义其实是接口隔离的原则,即把本质上并不内聚的两种体系区别开来,使得它们可以松散的组合,而策略在解耦上还仅仅是某一个算法的层次,没有到体系这一层次。
  • 从结构图中可以看到,策略模式的结构是包容在桥接模式结构中的,Abstraction与Implementor之间就可以认为是策略模式,但是桥接模式一般Implementor将提供一系列的成体系的操作,而且Implementor是具有状态和数据的静态结构。而且桥接模式Abstraction也可以独立变化。

转载地址:http://pqgxo.baihongyu.com/

你可能感兴趣的文章
Linux 学习_samba
查看>>
不说技术~有时,开发者还是应该讲究一点!
查看>>
如何做好工作流定义
查看>>
.NET I/O 学习笔记:目录和文件
查看>>
pgpool-II3.1 的begin transaction 和 自动追加 BEGIN/COMMIT问题
查看>>
(转)记hadoop故障一例:BlockAlreadyExistsException
查看>>
hdu 4284 Travel floyd + 状压DP
查看>>
相似数据检测算法
查看>>
spring中的设计模式Observer pattern
查看>>
Lazarus 1.0.2 发布,Pascal 集成开发环境
查看>>
内核进程的堆栈 [转]
查看>>
xp|win7中删除过期的[自定义通知]
查看>>
IBM SOA[ESB,BPM,Portal等]基础架构图解
查看>>
分享:在django中执行脚本
查看>>
试用mysql的infobright引擎
查看>>
BIND9源码分析奠基
查看>>
转:请对照这二十四条逻辑谬误自行打脸
查看>>
hdu1573-X问题
查看>>
Eclipse 4.3 Kepler最快汉化方法
查看>>
VS2010 常用快捷键
查看>>