【设计模式】策略模式

1,意图:

  定义一系列的算法/或者行为,把他们一个个封装起来,并且使得他们可以相互替换。使得算法和行为的变化可以独立于他们的客户而变化。

  例子: 实例化一个Person,我们吃意大利面可以用叉子,但是不习惯的人可以用筷子,这种吃面的行为或者说不同的算法可以独立的切换或者使用。

2,别名

   Policy

3,动机

    对象直接包含某种算法会复杂化问题,使得客户程序庞大且难以维护,当我们需要支持多种算法或者行为(通常这些行为或者算法是互斥的,客户同一时刻只会选择其中某一种算法或者行为 )

4,适用性:

     许多相关的类,仅仅是行为有差异。“策略”提供了一种用多个行为的一个行为来配置一个类的方法。

     一个类定义了多种行为,并且这些行为在这个类的操作种以多个条件语句的行为出现。应该将相关的条件分之移入它们格子的Strategy类中代替这些条件语句。  【简易计算器,2个number的4种基础运算】

     需要使用一个算法的不同变体。【我们有一个文本流,要对其进行分析决定换行,需要不同的情况采用不同的算法】

以这个换行算法为例:我们定义不同的类来封装不同的换行算法,从而避免上面提到的问题。

 

 

实现:

composition长这样:

import Compositor from "./Compositor";

export default class Composition {
  private _compositor
  constructor(compositor: Compositor) {
    this._compositor = compositor
  }
  repair() {
    this._compositor.compose()
  }
}

接口【也可以定义成抽象类】Compositor长这样:

export default interface Compositor {
  compose(param: any)
}

一共有三种算法,我们只展示其中一种,其余两种根据需求不同是不同的逻辑,但是结构是一样的,我们看SimpleCompositor的代码:

import Compositor from "./Compositor";

export default class implements Compositor {
  constructor(){}
  compose(param: any){
    console.log('策略1')
  }
}

测试入口文件长这样:

import Composition from "./Composition";
import SimpleCompositor from "./SimpleCompositor";
import TeXcompositor from "./TeXcompositor";
import ArrayCompositor from "./ArrayCompositor";

const quick = new Composition(new SimpleCompositor()),
      slick = new Composition(new TeXcompositor()),
      iconic = new Composition(new ArrayCompositor())
quick.repair()
slick.repair()
iconic.repair()

5,参与者:

   Strategy(策略,对应上面Compositor)

   ConcreteStrategy(具体策略,对应上面SimpleCompositor 等具体实现类)

   Context(上下文,对应上面Composition)

缺点:

客户必须知道所有的策略类,并自行决定。

策略类过多的解决方案: 工厂方法

上面的所有代码看这里: https://github.com/aeolusheath/design-pattern/tree/master/Strategy

 

参考资料:基本都来自于书籍 《设计模式:可复用面向对象软件的基础》 5.9 

                    菜鸟教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值