策略模式(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
类关系图:
![](https://www.itzhimei.com/wp-content/uploads/2020/07/image-4-1024x330.png)
策略模式,看起来是不是和工厂模式有点像。工厂是以生产对象为主要职责,策略模式则是以不同策略的执行为主要职责,出发点不同,目标也不同。