策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
简单,对称,优美,高效
策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且是他们之间可以相互替换。
优点:
1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
动态地让context对象选择行为的不同表现行为;
缺点:
1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景
资金系统,对接不同的银行;支付方式,查询余额、批量支付;
商城活动中有几种,满减,打折,送积分
主要角色如下:
抽象策略角色 这是一个抽象角色,通常由一个接口或抽象类来实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色 包装了具体的算法或行为
环境角色持有一个strategy的引用
创建一个接口。
public interface Strategy {
public int doOperation(int num1, int num2);
}
创建实现接口的实体类。
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
public class OperationSubtract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
创建 Context 类。
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);
}
}
使用 Context 来查看当它改变策略 Strategy 时的行为变化。
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));
}
}