乐趣区

关于前端:2-设计模式之策略模式

一、定义

明天咱们探讨的设计模式是「策略模式」,策略模式比拟好了解,首先咱们看一下他的定义:

策略模式是一种定义一系列算法的办法,从概念上来看,所有这些算法实现的都是雷同的工作,只是实现不同,他能够以雷同的形式调用所有的算法,缩小了各种算法类与应用算法类之间的耦合「DEP」。

由下面的定义咱们能够看到,策略模式有 3 个因素:

  • 策略模板:策略模式的算法都是为了实现雷同的工作的,只是可能触发条件不同,所以咱们就能够形象进去一个策略模板,相似于「工厂模式中的产品模板」;
  • 策略:依据具体场景实现不同的策略,以依据理论场景失去具体的后果;
  • 上下文:上下文依据场景不同来决定应用哪种策略。

二、举例说明

策略模式在生活中也比拟常见,上面举例说明:

当咱们在生活中乘坐公交地铁的时候,合肥市的票价是 2 元、学生半价、老年人免票,这就是一种常见的设计模式,咱们能够看出:

  • 都是为了解决人们乘车计价的问题
  • 不同年龄段的人计算价格办法不同

那咱们就有实现计划:

// 策略模板
class StrategyTemplate {constructor() {}}

// 老年人免票
class OldPersonStrategy extends StrategyTemplate {constructor() {}

    calculatePrice() {return 0;}
}

// 学生半价
class StudentStrategy extends StrategyTemplate {constructor() {}

    calculatePrice() {return 1;}
}

// 普票 2 元
class NormalStrategy extends StrategyTemplate {constructor() {}

    calculatePrice() {return 2;}
}

// 上下文传入策略并应用
class BusContext {constructor(strategy) {this.strategy = strategy;}

    pay() {return this.strategy.calculatePrice();
    }
}

// 应用
const oldPerson = new BusContext(new OldPersonStrategy());
oldPerson.pay();
const student = new BusContext(new StudentStrategy());
student.pay();
const person = new BusContext(new NormalStrategy());
person.pay();

生存中咱们随处可见也有很多策略模式的应用,比方洗衣机(快洗、漂洗、大件等)、电饭煲(煮饭、煮粥等)、电动牙刷(高频、中频、低频)、购物(满减、打折、返利等)。

总结

由下面这么多的例子咱们能够总结进去,策略模式的应用场景有几个特点:

  • 面对一个问题 / 需要有多种解决策略,须要判断不同的场景
  • 场景的数量较少

长处就是:

  • 策略与策略之间互相独立,扩展性、维护性比拟好
  • 单元测试好做
  • 缩小了 switch/if else 判断

毛病就是:

  • 不适宜解决场景太多的状况

参考

大话设计模式 – 程杰

五分钟学设计模式.10. 策略模式

集体博客

北落师门的博客

退出移动版