玩命加载中🤣🤣🤣

js下的策略模式demo


js下的策略模式demo

记一次demo

定义策略map

const STRATEGY_TYPE = {
    STRATEGY_A: 1,
    STRATEGY_B: 2,
    STRATEGY_C: 3
}

策略类

const STRATEGY_A = function () {}
STRATEGY_A.prototype.xxxMethod = async function (params) {
	// 具体策略逻辑
    return data
}

const STRATEGY_B = function () {}
STRATEGY_B.prototype.xxxMethod = async function (params) {
	// 具体策略逻辑
    return data
}

const STRATEGY_C = function () {}
STRATEGY_C.prototype.xxxMethod = async function (params) {
	// 具体策略逻辑
    return data
}

上下文

上下文中包含一些属性,可以其中包括具体的策略对象,和一些参数

const XXXContext = function () {
    this.strategy = null
    this.requestData = null
}

XXXContext.prototype.setStrategy = function (strategy) {
    this.strategy = strategy
}

// 如果需要参数也可以传入
XXXContext.prototype.setRequestData = function (requestData) {
    this.requestData = requestData
}

XXXContext.prototype.doXXX = async function () {
    return await this.strategy.xxxMethod(this.requestData)
}

策略的使用

以第一种策略为例

const context = new XXXContext()
// 设置策略
context.setStrategy(new STRATEGY_A())
// 设置参数
context.setRequestData(xxxData)
// 执行策略
let res = await context.doXXX()
// 处理结果

记一次vue下的demo

<script>标签内定义策略相关

策略类

class XxxStrategy {
  // vm 表示当前组件, data表示其他参数
  constructor(vm, data) {
    this.vm = vm
    this.data = data
  }

  async execute() {
    throw new Error('未实现方法')
  }
}

策略实现

class AStrategy extends ColumnStrategy {
  async execute() {
    // 具体实现逻辑
  }
}

class BStrategy extends ColumnStrategy {
  // 如果有定制化参数
  constructor(vm, data, otherParam) {
      super(vm, data)
      this.otherParam = otherParam
  }
  async execute() {
    // 具体实现逻辑
  }
}

上下文

function xxxStrategyContext(type, vm, data, otherParam) {
  switch (type) {
    case A:
      return new ActionColumnStrategy(vm, data)
    case B:
      return new NormalColumnStrategy(vm, data, otherParam)
    default:
      throw new Error('参数错误')
  }
}

组件方法内

策略的使用

const strategy = xxxStrategyContext(this.columnType, this, data, ?otherParam)
strategy.execute()

文章作者: 👑Dee👑
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 👑Dee👑 !
  目录