一 、什么是策略模式?
策略模式指的是可以实现目标的方案集合,在某些特定情况下,策略之间是可以相互替换的。
如满减活动中,可以有满30减5元、满50减10元等,
如购物系统中针对不通过用户等级进行不同的折扣,原价(普通顾客),九折(会员),八折(超级会员)和七折(金牌会员)等,这些策略相互排斥、可替换。
一种行为型模式,指的是定义一系列算法,将每一个算法封装起来,并让他们可以相互替换。
策略模式只适用管理一组同类型的算法,并且这些算法是完成互斥的。
二、策略模式角色组成
- 封装角色:上层访问策略的入口,它持有抽象策略角色的引用
- 抽象策略角色:提供接口或者抽象类,定义策略组必须拥有的方法和属性
- 抽象策略角色:提供接口或者抽象类,定义策略组必须拥有的方法和属性
- 客户端:策略调用方
三、关系图
四、策略模式的优点?
- 最小范围修改。
- 避免代码重复。
- 减少if-else, 避免多重if-else判断。
- 降低维护成本。
- 提示可扩展性。
五、策略模式的缺点?
- 策略类会增多。
- 所有策略类都需要对外暴露。
六、实现
我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
步骤 1
创建一个接口。
Strategy.java
public interface Strategy {
public int doOperation(int num1, int num2);
}`
步骤 2
创建实现接口的实体类。
OperationAdd.java
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
OperationSubtract.java
public class OperationSubtract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
OperationMultiply.java
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
步骤 3
创建 Context 类。
Context.java
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
步骤 4
使用 Context 来查看当它改变策略 Strategy 时的行为变化。
StrategyPatternDemo.java
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
步骤 5
执行程序,输出结果:
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
参考文档:https://www.cnblogs.com/mr-wuxiansheng/p/14459457.html