美文网首页
1. 策略模式

1. 策略模式

作者: bit_拳倾天下 | 来源:发表于2021-03-01 17:01 被阅读0次

什么是策略模式?

定义算法族,分别封装起来,让他们可以互相替换,从而让算法的变化独立于实用算法的客户。

举个例子:

鸭子,它会叫,有的会飞,要建立鸭子的模型,伪代码如下:


传统结构

首先是一个 Duck 超类,有 name 属性,和 fly、quark 两个方法,所有的鸭子都去实现这个 Duck,实现 fly、quark 两个方法。

这样做有两个弊端:

  1. 每个实现类都要重写 fly、quark;
  2. fly、quark 不能复用,例如上图: RedDuck 和 GreenDuck 都是 “嘎嘎叫”,却要实现两次。

像这样的结构,既有相同的部分(如: name),又会有不同的行为(fly、quark),为了提高程序复用性和可维护性,可以利用 策略模式 进行改造。

在编程中,比较实用的一条原则:将变化的部分和不变的部分分离开来。在本例中,将 fly、quark抽取为接口,然后由具体实现定义行为:


fly行为
quark行为

Duck 中定义两个行为变量,并在 fly、quark 中,调用变量的 fly、quark。


新的Duck

现在,Duck 和它的子类就可以和 fly、quark 解耦了。在使用时,可以通过构造方法或者 setter,设置flyBehavior、quarkBehavior 为对应的行为实现类对象,就可以完成“飞行”和“叫”这两个行为。这样行为组就可以复用,并且可以灵活组合。

总结

现在,再对照着例子回头看一下 策略模式 :定义算法族,分别封装起来,让他们可以互相替换,从而让算法的变化独立于使用算法的客户。

在演示中,fly、quark被抽取成接口(FlyBehavior,QuarkBehavior),它们就可以称为算法族,通过设置对象(Duck)的属性(flyBehavior,quarkBehavior)实现不同的行为。如 flyBehavior 属性,可以根据需要设置为 FlyUnable 或 FlyWithWing,是可以替换的。

这样看来,代码量好像反而增加了,但是如果需求在不断的膨胀,这种模式的的优势就越来越明显。在传统结构中,每种鸭子都要实现方法,而且有可能实现的内容会重复,代码堆积越来越多;改造之后,每种鸭子只需继承 Duck,只要关注 flyBehavior,quarkBehavior 两个属性就好了。

  1. 将变化的部分抽取出来,解耦
  2. 算法族可以灵活组合
  3. 代码复用性高
  4. 方便维护

相关文章

  • 11.7设计模式-策略模式-详解

    设计模式-策略模式 策略模式详解 策略模式在android中的实际运用 1.策略模式详解 2.策略模式在andro...

  • 设计模式[13]-策略模式-Strategy Pattern

    1.策略模式简介 策略模式(Strategy Patter)是行为型(Behavioral)设计模式,策略模式封装...

  • 1. 策略模式

    设计原则 找出应用中可能需要变化之处,把它们独立出来。不要和那些不需要变化的代码混在一起 针对接口编程,而不是针对...

  • 1.策略模式

    模拟鸭子应用 需求 游戏中会出现各种鸭子,一边游泳戏水,一边呱呱叫。 一开始,是通过使用继承的方式,用派生类实现各...

  • 1. 策略模式

    什么是策略模式? 定义算法族,分别封装起来,让他们可以互相替换,从而让算法的变化独立于实用算法的客户。 举个例子:...

  • iOS 设计模式-策略模式

    1.策略模式简介   策略模式(Strategy Pattern),是行为型模式之一(设计模式分类:https:/...

  • if-else代码优化方案①策略模式 ②Map+Function

    if-else?解决方案①策略模式 ②Map+Function函数式接口 1.策略模式解决if-else 策略模式...

  • java 策略模式

    策略模式1.策略模式简介策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具...

  • 策略模式

    本文参考自: 《JAVA设计模式》之策略模式(Strategy) 1. 作用 策略模式属于对象的行为模式。其用意是...

  • 策略模式

    1.策略模式概念 策略模式(Strategy Pattern),实现一个类的行为或其算法可以在运行时更改。策略模式...

网友评论

      本文标题:1. 策略模式

      本文链接:https://www.haomeiwen.com/subject/oadafltx.html