js设计模式 --- 策略设计模式

策略设计模式

Strategy模式是一种行为型设计模式,它将算法一个个封装起来,在某一时刻能够互换地使用其中的一个算法。从概念上看,所有这些算法完成的都是相同的工作,只是实现不同而已.

它的实现形式和桥接设计模式非常的相似, 只不过动机不同, 一些细节不同而已

下面来看两种模式的结构图

  • 桥接模式
    《js设计模式 --- 策略设计模式》
  • 策略模式
    同样,Context也会包含一个指向Strategy对象的指针,使得Context可以使用不同的策略算法,甚至Context也可以有子类,使得类图和Bridge完全一样.
    《js设计模式 --- 策略设计模式》

实际上所有对原有功能拓展模式可以只分为类模式和对象模式两种,类模式是用继承而对象模式是用委托 ,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也可以独立变化。
    原文作者:设计模式
    原文地址: https://segmentfault.com/a/1190000013326254
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞