设计模式之我见系列——策略模式

一、设计图

二、Demo代码

1. Strategy接口

package com.mc.core;

/**
 * Created by LCF on 2016/1/25.
 * 功能:核心策略的具体实现类。
 * 说明:Java中类不加任何修饰符是默认状态,此情况只允许在同一个包访问,之所以这么设计是为了减少暴露不必要变量的风险。
 * 观点:个人认为对于类或者方法:能不暴露更多的就不暴露更多的。
 */
interface Strategy {
    /**
     * 包含核心策略的公共接口
     * @param a
     * @param b
     * @return
     */
    int operate(int a, int b);
}

 说明:此接口包含抽象出来的核心的策略。

2. AddStrategy和SubStrategy

package com.mc.core;

/**
 * Created by LCF on 2016/1/25.
 * 功能:加法策略的具体实现类。
 * 说明:Java中类不加任何修饰符是默认状态,此情况只允许在同一个包访问,之所以这么设计是为了减少暴露不必要变量的风险。
 * 观点:个人认为对于类或者方法:能不暴露更多的就不暴露更多的。
 */
class AddStrategy implements Strategy {
    @Override
    public int operate(int a, int b) {
        return a+b;
    }
}
package com.mc.core;

/**
 * Created by LCF on 2016/1/25.
 * 功能:减法策略的具体实现类。
 * 说明:Java中类不加任何修饰符是默认状态,此情况只允许在同一个包访问,之所以这么设计是为了减少暴露不必要变量的风险。
 * 观点:个人认为对于类或者方法:能不暴露更多的就不暴露更多的。
 */
class SubStrategy implements Strategy {
    @Override
    public int operate(int a, int b) {
        return a - b;
    }
}

说明:上述2个类,都是核心策略接口的具体实现类。

3. Context类

package com.mc.core;

/**
 * Created by LCF on 2016/1/25.
 * 上下文对象实现类,有承上启下的作用。
 */
public class Context {
    /**
     * 限制用户调用无参构造方法
     */
    private Context(){}

    /**
     * 策略的公共接口类
     */
    private Strategy strategy;

    /**
     * 枚举类型限制选择。
     */
    public enum Choice{
        ADD,SUB
    }

    /**
     * 构造方法为确定使用哪种策略
     * @param choice 具体策略的映射
     */
    public Context(Choice choice){
        if ("ADD".equals(choice.toString())) {
            strategy=new AddStrategy();
        }else{
            strategy=new SubStrategy();
        }
    }

    /**
     * 本质为调用公共接口类的方法。
     * @param a 运算所需第一个参数
     * @param b 运算所需第二个参数
     * @return
     */
    public int operate(int a,int b){
        return strategy.operate(a,b);
    }
}

说明:此为承上启下的上下文对象类,1. 此类中要由构造函数确定具体调用那种实现类,2. 还要传入实现策略的具体数据。

项目开源在:http://git.oschina.net/codingox/DesignPattern-Strategy

原文地址:https://www.cnblogs.com/LiuChunfu/p/5157336.html