讲故事,学(AHK)设计模式—策略模式

本文的主要内容:

策略模式概述
示例:商场购物打折策略的实现
策略模式总结

策略模式概述

策略模式(Strategy Pattern)设计模式行为型的一种。
在这里插入图片描述

在软件开发中,我们也常常会遇到类似的情况,实现某一个功能有多条途径,每一条途径对应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径。

譬如商场购物场景中,有些商品按原价卖,商场可能为了促销而推出优惠活动,有些商品打九折,有些打八折,有些则是返现10元等。

而优惠活动并不影响结算之外的其他过程,只是在结算的时候需要根据优惠方案结算。
商场促销场景

角色
Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。

Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

示例

在这里插入图片描述
定义抽象策略类:CashSuper.ahk

Class CashSuper{
	__Call()
	{
		Return "必须先将策略类实例化,不能直接用CashSuper"
	}
  ;以上相当于变相实现了抽象类(接口)
  acceptCash(money)
  {

  }
}

定义环境类Context.ahk

#include CashSuper.ahk
class CashContext{
  cs:=new CashSuper ;声明一个CashSuper对象  cs持有一个具体策略的对象strategy
  __New(cashSuper)
  {
    this.cs:=cashSuper
  }
  getResult(money){
    return this.cs.acceptCash(money)
  }
}

定义具体策略类:无优惠,CashNormal.ahk

Class CashNormal extends CashSuper{
;必须实现acceptCash(money)函数,否则报错
  acceptCash(money){
    return money
  }
}

定义具体策略类: 打折,CashRebate

Class CashRebate extends CashSuper{
  moneyRebate:=
  __New(moneyRebate){
    this.moneyRebate:=moneyRebate
  }
  acceptCash(money){
    return money*this.moneyRebate
  }
}

定义具体策略类: 返现,CashRebate


class CashReturn extends CashSuper{
  moneyCondition:=
  moneyReturn:=
  __New(moneyCondition,moneyReturn)
  {
    this.moneyCondition:=moneyCondition
    this.moneyReturn:=moneyReturn
  }
  acceptCash(money){
    result:=money
    if(money>=this.moneyCondition){
      result:=money-Floor(money/this.moneyCondition)*this.moneyReturn
    }
    return result
  }
}

定义客户端测试,CashTest.ahk

#include %A_ScriptDir%

#include CashContext.ahk
#include CashNormal.ahk
#include CashRebate.ahk
#include CashReturn.ahk


cc1:=new CashContext(new CashNormal())
cc2:=new CashContext(new CashRebate(0.8))
cc3:=new CashContext(new CashReturn(300,100))
MsgBox % "CashNormal `n"  cc1.getResult(300)
MsgBox % "CashRebate `n"  cc2.getResult(300)
MsgBox % "CashReturn `n"  cc3.getResult(300)

Guess you like

Origin blog.csdn.net/liuyukuan/article/details/120235966