具体请查看原文的图文教程:https://blog.csdn.net/liuyukuan/article/details/120235966
以下为文章摘要:
本文的主要内容:
策略模式概述
示例:商场购物打折策略的实现
策略模式总结
策略模式概述
策略模式(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
}
}
1
2
3
4
5
6
定义具体策略类: 打折,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)
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)