策略模式

来源:互联网 发布:抗日知乎 编辑:程序博客网 时间:2024/06/05 14:07

例子:商场促销------策略模式

基本需求:就是计算收银,通过单价*数量

增加需求:遇到活动,会打折

小菜的代码问题:1)分支语句过多2)无法应对新的需求即满300100,满300100,、8折、7折、原价

收获:面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是

抽象,具有相同属性和功能对象的抽象集合才是类。

因此策略模式的最后结果是

 



 

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

 

其实有上面那么多的打折需求,现在只变成了3个类,可以理解为在纷繁复杂的世界

中对对象又进一步提取为一个类。

下面一一解释一下:

现金收费抽象类

        功能:收取现金

正常收费类

       功能:原价返回

打折收费子类:

     功能:通过动态的输入参数的方法,打折的折扣率,再计算原价

返利收费子类:

     功能:通过初始化的时候设置两个参数,(返利条件,返利值),计算收取现金

现金收费工厂类:

    功能:根据条件返回相应的对象。

客户端程序:实例化简单工厂

 

 

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

 

闪亮登场:策略模式

定义:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

封装变化点就是我们面向对象的一种很重要的思维方式。

代码结构图

 



 

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

解释:

CashSuper类:

         功能:定义所有支持的算法的公共接口

Cash Contex类:

        功能:1)通过通过初始化的时候,传入具体的策略,决定用哪一个算法;

                      2)通过具体的策略对象,调用其算法.

其实以上的本质恰恰是:封装了变化,用传递参数的方法,取代了case,实在是

一个高明的策略。

 

反思:

       应用条件:

        只要在分析过程中听到需要不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

     概念上讲:

       算法完成相同的工作,只是实现不同,他可以以相同的方式调用所有的算法。