策略模式【Strategy Pattern】

在软件开发过程中有这样一种场景.假设,我们公司的业务人员去实勘房源(检测用户发布的房子是否师真的),如果一个月实勘了十套以上,五十套一下的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 设计模式》也讲解的蛮有意思的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值