设计模式之 策略模式

策略模式(Strategy Pattern),定义一个算法簇,包含一系列算法,按照不同的需求,执行不同的策略算法。

举例来说,我们平时用的计算器,加、减、乘、除四种计算,都是数字计算,但是各有不同,我们根据四种计算,每种写一个计算的类,这每一个类,就是一个策略算法。我在需要计算加法的时候,执行加法策略算法类,需要减法的时候,执行减法策略算法类,从而实现策略效果。

策略模式的主要角色有:

1、抽象策略角色:定义公共策略方法。

2、具体策略角色:每个具体策略对应一个算法。

3、上下文环境角色:根据实际需求,选择要使用的策略算法。

我们就以上面的计算器的加、减、乘、除四种计算,来演示一下代码:

1、抽象策略类

package com.itzhimei.study.design.strategy;

/**
 * www.itzhimei.com
 * 策略模式--抽象策略
 */
public interface IStrategy {

    int doHandle(int n1, int n2);
}

2、具体策略类,分别是加、减、乘、除四个策略类

package com.itzhimei.study.design.strategy;

/**
 * www.itzhimei.com
 * 策略模式--加法策略
 */
public class StrategyAdd implements IStrategy {
    @Override
    public int doHandle(int n1, int n2) {
        return n1+n2;
    }
}
package com.itzhimei.study.design.strategy;

/**
 * www.itzhimei.com
 * 策略模式--减法策略
 */
public class StrategySubtract implements IStrategy {
    @Override
    public int doHandle(int n1, int n2) {
        return n1-n2;
    }
}
package com.itzhimei.study.design.strategy;

/**
 * www.itzhimei.com
 * 策略模式--乘法策略
 */
public class StrategyMultiply implements IStrategy {
    @Override
    public int doHandle(int n1, int n2) {
        return n1*n2;
    }
}
package com.itzhimei.study.design.strategy;

/**
 * www.itzhimei.com
 * 策略模式--出发策略
 */
public class StrategyDivision implements IStrategy {
    @Override
    public int doHandle(int n1, int n2) {
        return n1/n2;
    }
}

3、上下文角色类

package com.itzhimei.study.design.strategy;

/**
 * www.itzhimei.com
 * 策略模式--上下文类
 */
public class Context {

    private IStrategy strategy;

    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }

    public int doHandle(int n1, int n2) {
        return this.strategy.doHandle(n1, n2);
    }
}

上下文中持有策略的引用,由上下文类来执行实际算法。

输出结果:

加法计算:3
减法计算:-1
乘法计算:2
除法计算:0

类关系图:

策略模式,看起来是不是和工厂模式有点像。工厂是以生产对象为主要职责,策略模式则是以不同策略的执行为主要职责,出发点不同,目标也不同。