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=1739353659-YYclgViJyqhH8PeEd2QFmYx2LnqguSFd-0-f3d098b3af911c1cfb2bedd0d25bfff8)
CashContext类
![](https://epubservercos.yuewen.com/13207C/21821972708814406/epubprivate/OEBPS/Images/Figure-P48_78142.jpg?sign=1739353659-hr8XmMRlHyiCbjRXkODAtu6RjgMHnOcH-0-4183694dda659bab6117e27942322a11)
客户端主要代码
![](https://epubservercos.yuewen.com/13207C/21821972708814406/epubprivate/OEBPS/Images/Figure-P49_78144.jpg?sign=1739353659-bqkEhIcEWspcZSOb4q1aKmxMzlCgbh9k-0-55fcd6da3b389c9030e13f78299c02e7)
“大鸟,代码是模仿着写出来了。但我感觉这样子做不又回到了原来的老路了吗,在客户端去判断用哪一个算法?”
“是的,但是你有没有什么好办法,把这个判断的过程从客户端程序转移走呢?”
“转移?不明白,原来我用简单工厂是可以转移的,现在这样子如何做到?”
“难道简单工厂就一定要是一个单独的类吗?难道不可以与策略模式的Context结合?”
“哦,我明白你的意思了。我试试看。”