欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

每天一个设计模式·策略模式

程序员文章站 2022-05-18 18:19:56
"策略模式原文地址" "更多《设计模式系列教程》" "更多免费教程" 0. 项目地址 作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用 ( 靠这吃饭 )和 ( 纯粹喜欢 )两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) "本节课代码" "《 ......

0. 项目地址

作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript靠这吃饭)和python纯粹喜欢)两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :)

1. 什么是策略模式?

策略模式定义:就是能够把一系列“可互换的”算法封装起来,并根据用户需求来选择其中一种。

策略模式实现的核心就是:将算法的使用和算法的实现分离。算法的实现交给策略类。算法的使用交给环境类,环境类会根据不同的情况选择合适的算法。

2. 策略模式优缺点

在使用策略模式的时候,需要了解所有的“策略”(strategy)之间的异同点,才能选择合适的“策略”进行调用。

3. 代码实现

3.1 python3实现

class stragegy():
  # 子类必须实现 interface 方法
  def interface(self):
    raise notimplementederror()

# 策略a
class stragegya():
  def interface(self):
    print("this is stragegy a")

# 策略b
class stragegyb():
  def interface(self):
    print("this is stragegy b")

# 环境类:根据用户传来的不同的策略进行实例化,并调用相关算法
class context():
  def __init__(self, stragegy):
    self.__stragegy = stragegy()
  
  # 更新策略
  def update_stragegy(self, stragegy):
    self.__stragegy = stragegy()
  
  # 调用算法
  def interface(self):
    return self.__stragegy.interface()


if __name__ == "__main__":
  # 使用策略a的算法
  cxt = context( stragegya )
  cxt.interface()

  # 使用策略b的算法
  cxt.update_stragegy( stragegyb )
  cxt.interface()

3.2 javascript实现

// 策略类
const strategies = {
  a() {
    console.log("this is stragegy a");
  },
  b() {
    console.log("this is stragegy b");
  }
};

// 环境类
const context = name => {
  return strategies[name]();
};

// 调用策略a
context("a");
// 调用策略b
context("b");

4. 参考