您的位置:首页 > 其它

策略模式

2013-05-12 17:16 148 查看
例子:商场促销------策略模式
基本需求:就是计算收银,通过单价*数量
增加需求:遇到活动,会打折
小菜的代码问题:1)分支语句过多2)无法应对新的需求即满300赠100,满300返100,、8折、7折、原价
收获:面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是
抽象,具有相同属性和功能对象的抽象集合才是类。
因此策略模式的最后结果是





屏幕剪辑的捕获时间: 2013/5/12 16:53

其实有上面那么多的打折需求,现在只变成了3个类,可以理解为在纷繁复杂的世界
中对对象又进一步提取为一个类。
下面一一解释一下:
现金收费抽象类
功能:收取现金
正常收费类
功能:原价返回
打折收费子类:
功能:通过动态的输入参数的方法,打折的折扣率,再计算原价
返利收费子类:
功能:通过初始化的时候设置两个参数,(返利条件,返利值),计算收取现金
现金收费工厂类:
功能:根据条件返回相应的对象。
客户端程序:实例化简单工厂


新问题:1)每次维护或拓展收费方式都要改动这个工厂,以致代码需要重新编译,是很糟糕的处理方式。

闪亮登场:策略模式
定义:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
封装变化点就是我们面向对象的一种很重要的思维方式。
代码结构图





屏幕剪辑的捕获时间: 2013/5/12 17:12
解释:
CashSuper类:
功能:定义所有支持的算法的公共接口
Cash Contex类:
功能:1)通过通过初始化的时候,传入具体的策略,决定用哪一个算法;
2)通过具体的策略对象,调用其算法.
其实以上的本质恰恰是:封装了变化,用传递参数的方法,取代了case,实在是
一个高明的策略。

反思:
应用条件:
只要在分析过程中听到需要不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
概念上讲:
算法完成相同的工作,只是实现不同,他可以以相同的方式调用所有的算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: