策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式主要分为以下三个角色:
1. 环境角色(Context):持有一个策略类引用
2. 抽象策略(Strategy):定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。一般的,我们使用接口或抽象类实现。
3. 具体策略(ConcreteStrategy):实现抽象策略类中的相关的算法或操作。
//一个算法接口
public interface Calculate {
//一个待实现方法
int calculate(int a,int b);
}
//一个加法策略类,实现算法接口
public class AddCalculate implements Calculate {
@Override
//接口方法具体实现之加法
public int calculate(int a, int b) {
return a+b;
}
}
//一个除法策略类,实现算法接口
public class DivideCalculate implements Calculate{
@Override
//接口方法具体实现之除法
public int calculate(int a, int b) {
return a/b;
}
}
//一个环境角色类,持有对接口的引用
public class EnvironmentRole {
private Calculate cal;
//构造方法对变量完成赋值
public EnvironmentRole(Calculate cal)
{
this.cal = cal;
}
//获得策略类对象
public Calculate getCalculate()
{
return cal;
}
//用set方法注入策略对象
public void setCalculate(Calculate cal)
{
this.cal = cal;
}
//环境角色中的接口方法,其具体结果依赖于策略引用指向的具体策略角色对象
public int calculate(int a,int b) {
return cal.calculate(a, b);
}
}
////一个客户端演示
public class Client {
public static void main(String[] args)
{
Calculate add = new AddCalculate();
EnvironmentRole environmentRole = new EnvironmentRole(add);
System.out.println(environmentRole.calculate(3, 4));
Calculate divide = new DivideCalculate();
EnvironmentRole environment = new EnvironmentRole(divide);
System.out.println(environment.calculate(9, 3));
}
}