2.5 策略模式实现
“我明白了,”小菜说,“我昨天写的CashSuper就是抽象策略,而正常收费CashNormal、打折收费CashRebate和返利收费CashReturn就是三个具体策略,也就是策略模式中说的具体算法,对吧?”
“是的,来吧,你模仿策略模式的基本代码,改写一下你的程序。”
“其实不麻烦,原来写的CashSuper、CashNormal、CashRebate和CashReturn都不用更改了,只要加一个CashContext类,并改写一下客户端就行了。”
商场收银系统v1.2
代码结构图
![](https://epubservercos.yuewen.com/13207C/21821972708814406/epubprivate/OEBPS/Images/Figure-P48_78141.jpg?sign=1739684015-HYDI1TFoeTN5pFEl8C5pr3ivplztPdD6-0-c1b8ddeac25012a7e6c70e4c7ed1d80a)
CashContext类
![](https://epubservercos.yuewen.com/13207C/21821972708814406/epubprivate/OEBPS/Images/Figure-P48_78142.jpg?sign=1739684015-dNMQvqFJSPpUkFv8QTeZToTb6xtGTZUF-0-d2162c10c92ef3e1a9325b1a362721d3)
客户端主要代码
![](https://epubservercos.yuewen.com/13207C/21821972708814406/epubprivate/OEBPS/Images/Figure-P49_78144.jpg?sign=1739684015-UJFFydj9htzvqYeYob1BiML2xQKJpgFy-0-67b3cb67f685b2ac04aa69ccf172a0e9)
“大鸟,代码是模仿着写出来了。但我感觉这样子做不又回到了原来的老路了吗,在客户端去判断用哪一个算法?”
“是的,但是你有没有什么好办法,把这个判断的过程从客户端程序转移走呢?”
“转移?不明白,原来我用简单工厂是可以转移的,现在这样子如何做到?”
“难道简单工厂就一定要是一个单独的类吗?难道不可以与策略模式的Context结合?”
“哦,我明白你的意思了。我试试看。”