策略模式
一、定义
定义一组算法,将每个算法都封装起来,并且使它们之前可以相互转换。(Define a family of algorithms, encapsulate each one, and make them interchangeable.)
二、理解
单独抽取独自变化的行为,定义相应接口,实现并封装对应的行为,使得它们可以相互替换。
1. Context上下文角色
起承上启下的封装作用, 屏蔽高层对策略丶算法的直接访问, 封装可能的变化
2. Strategy策略接口
定义策略的接口
3. ConreteStrategy具体策略
实现策略接口,封装具体的算法
三、举例
3.1) 定义策略接口
/** * 策略 * @author TimFruit * @date 2019/5/21 7:40 */ public interface IAlgorithm { int doOperate(int num1, int num2); }
3.2) 实现策略接口
public class Add implements IAlgorithm { @Override public int doOperate(int num1, int num2) { return num1+num2; } }
public class Multiply implements IAlgorithm { @Override public int doOperate(int num1, int num2) { return num1 * num2; } }
3.3) 实现上下文
/** * 上下文,承载算法 * * @author TimFruit * @date 2019/5/21 8:03 */ public class Calculator { IAlgorithm algorithm; public Calculator(IAlgorithm algorithm) { this.algorithm = algorithm; } public int exec(int num1, int num2){ return algorithm.doOperate(num1, num2); } }
3.4) 测试场景
public class Client { public static void main(String[] args) { IAlgorithm algorithm=new Add(); Calculator calculator =new Calculator(algorithm); int num1=1; int num2=3; int result= calculator.exec(num1, num2); System.out.println("结果为: "+ result); } }
四丶策略枚举
/** * 策略枚举 * * 很优秀,但一般用于不经常变化的角色,因为受限于枚举类型 (拓展性非常差 T_T ) * * @author TimFruit * @date 2019/5/21 8:12 */ public enum Calculator { ADD { @Override int exec(int num1, int num2) { return num1+num2; } }, SUB { @Override int exec(int num1, int num2) { return num1-num2; } }, MULTIPLY { @Override int exec(int num1, int num2) { return num1 * num2; } }; abstract int exec(int num1, int num2); }
测试环境:
public class Client { public static void main(String[] args) { int num1=1; int num2=3; int result=Calculator.ADD.exec(num1, num2); System.out.println("结果为: "+ result); } }
学习资料:
<设计模式之禅>