策略模式【Strategy Pattern】

来源:互联网 发布:c语言返回值什么意思 编辑:程序博客网 时间:2024/05/17 23:33

在软件开发过程中有这样一种场景.假设,我们公司的业务人员去实勘房源(检测用户发布的房子是否师真的),如果一个月实勘了十套以上,五十套一下的N套房源则奖励该业务员(1*N + 10)个积分,十套一下奖励(1*N)个积分。五十套以上奖励(1*N+25)个积分。这些积分可都是钱啊!这些算法规则都是暂时也许下一个版本就变了,这都是需求的锅。


一种场景对应一种解决方式。策略模式,他定义了算法族,分别封装起来,让他们之间可以唔想替换,此模式让算法的变化,不会影响到算法客户(大话设计模式)。


public interface Ialgorithm {    //算法内容    int algorithmAction();}/** * 算法管理类 * Created by dushiguang on 16/9/19. */public class AlgorithmContext {    Ialgorithm mIalgorithm;    public AlgorithmContext(Ialgorithm mIalgorithm) {        this.mIalgorithm = mIalgorithm;    }    public int ContextInterface() {        return mIalgorithm.algorithmAction();    }}/** * 实勘数小于10的算法 */public class AlgorithmLose10 implements Ialgorithm {    private int num;    public AlgorithmLose10(int num) {        this.num = num;    }    @Override    public int algorithmAction() {        System.out.print("小于10的算法");        return num;    }}/** * 实勘数小于10大于50的算法 */public class AlgorithmMore10 implements Ialgorithm {    private int num;    public AlgorithmMore10(int num) {        this.num = num;    }    @Override    public int algorithmAction() {        System.out.print("大于10小于50的算法");        num = num + 10;        return num;    }}** * 实勘数大于50的算法 */public class AlgorithmMore50 implements Ialgorithm {    private int num;    public AlgorithmMore50(int num) {        this.num = num;    }    @Override    public int algorithmAction() {        System.out.print("大于50的算法");        num = num + 25;        return num;    }}/** * 使用者类 */public class MainAction {    private AlgorithmContext mAlgorithmContext;    private int num;    /**     *     * @param tag 根据参数选择相应的算法     */    private void acticon(int tag) {        if(tag < 10 && tag > 0) {            mAlgorithmContext = new AlgorithmContext(new AlgorithmLose10(tag));            num = mAlgorithmContext.ContextInterface();        } else if (tag > 10 && tag < 50) {            mAlgorithmContext = new AlgorithmContext(new AlgorithmMore10(tag));            num = mAlgorithmContext.ContextInterface();        } else if(tag > 50) {            mAlgorithmContext = new AlgorithmContext(new AlgorithmMore50(tag));            num = mAlgorithmContext.ContextInterface();        }        System.out.print("---" + num);    }}

这样可扩展性(OPC)就大大增加了,增加相应的算法类,修改选择添加即可。另外,策略模式和工厂模式结合起来可以更加降低耦合性。


PS:对于设计模式我只是作为学习笔记来写的,并非网上大牛们的手笔,所以各位看官看看就行,有错误请多多指正,要真正学习设计模式,书籍有,《大话设计模式》,这个需要C++语言底子,《您的设计模式》这个讲解的很有风趣,没有《大话设计模式》讲解的深,还有一本《Head First 设计模式》也讲解的蛮有意思的。

0 0