1. 什么是策略模式?
策略模式 定义了算法族,分别封装起来, 让它们之间可以互相替换,此模式让算法的变化独立于使用算法的用户
策略模式包含三个角色:
1. Context(环境):持有一个Strategy的引用。
2. Strategy(抽象策略):这是一个抽象角色,通常由一个接口或抽象类实现。定义了具体策略类所需实现的算法。
3. ConcreteStrategy(具体策略):封装了具体的算法实现。
2. 策略模式用来干什么?
策略模式可以在运行时动态的改变算法,前提是用户需要知道所有的算法,然后进行选择。(用户只有选择权)
3. 怎么实现策略模式?
我们来用计算器来模拟一个策略模式的例子,不一定合适,主要就是那么个意思。
首先我们定义一个计算器的类(Context),它持有一个计算的操作接口(Strategy),具体的加减乘除操作由子类(ConcreteStrategy)实现。
package com.strategy;
//计算器
public class Calculator {
private Calculation calculation;
public Calculator(Calculation calculation) {
this.calculation = calculation;
}
public Double execute(String numb1, String numb2) {
return calculation.operation(Double.parseDouble(numb1), Double.parseDouble(numb2));
}
}
package com.strategy;
//操作
public interface Calculation {
Double operation(Double numb1, Double numb2);
}
package com.strategy;
//加法操作
public class Addition implements Calculation {
@Override
public Double operation(Double numb1, Double numb2) {
return numb1 + numb1;
}
}
package com.strategy;
//减法操作
public class Subtraction implements Calculation {
@Override
public Double operation(Double numb1, Double numb2) {
return numb1 - numb2;
}
}
package com.strategy;
//乘法操作
public class Multiplication implements Calculation {
@Override
public Double operation(Double numb1, Double numb2) {
return numb1 * numb2;
}
}
package com.strategy;
//除法操作
public class Division implements Calculation {
@Override
public Double operation(Double numb1, Double numb2) {
return numb1 / numb2;
}
}
测试:我们使用策略模式,封装了具体的算法,用户只用选择某种算法,而不需要知道具体的实现,而当需要新增或者修改算法时,也不会影响到原有的操作。
我们可以举几个具体的场景来理解,比如说,现在的支付方式(微信,支付宝,银行卡),用户只能在提供的几种支付方式中选择一种。
还有比如 以不同的格式保存文件、不同的算法压缩文件等等之类的都可以用策略模式来实现。