策略模式(案例:四则运算 + - * / )
策略模式(Strategy Pattern)是一种行为设计模式,用来定义一系列的算法,把它们一个个封装起来,并使它们可以相互替换。该模式使得算法可以独立于使用它的客户端而变化,也即算法可以独立于它们的上下文进行变化。策略模式是一种很常用的设计模式,广泛应用于需要从多种算法或业务规则中选择一种算法或规则的系统中。
目的和优势:
- 封装变化:将算法的变化封装在各个策略类中,而不是在使用算法的环境中。
- 避免使用多重条件选择语句:策略模式提供了一种用条件语句选择所需算法的替代方法。
- 易于扩展:添加一个新的策略只需实现一个接口即可,无需修改现有代码。
- 符合开闭原则:系统可以在不修改原有代码的情况下引入新的算法。
结构组成:
策略模式主要包括三个角色:
- 环境类(Context):用来操作策略的上下文环境,它是客户端使用策略的入口。
- 抽象策略类(Strategy Interface):定义所有支持的算法的公共接口。Context使用这个接口来调用某个Concrete Strategy定义的算法。
- 具体策略类(Concrete Strategy):实现策略接口,提供具体的算法实现。
适用场景:
- 需要在运行时选择算法的行为:当系统需要根据不同的情况使用不同的算法时,可以使用策略模式。例如,根据不同的支付方式选择不同的支付策略。
- 避免使用大量的条件语句:如果在代码中使用大量的条件语句来选择不同的行为,可以考虑使用策略模式。策略模式可以将每种行为封装在单独的策略对象中,从而简化代码并提高可读性。
- 算法的实现可能频繁变化:如果系统中的算法实现可能经常变化,而且这种变化不希望影响到客户端代码,可以使用策略模式。策略模式将算法的实现与客户端代码分离,使得可以轻松地添加、删除或替换策略而不影响客户端代码。
- 需要通过继承或组合来扩展算法的行为:策略模式可以通过继承或组合来扩展算法的行为。通过定义新的策略对象,可以轻松地添加新的行为,而不影响现有的代码。
总之,策略模式适用于需要在运行时选择算法的行为,并且希望通过封装算法和消除大量的条件语句来提高代码的可读性和可维护性的情况。
抽象策略类:
// 抽象策略类
public abstract class Operation {
abstract int doOperation(int x,int y) ; //算法的具体实现
}
具体策略类:
//加法运算
public class addOperationStrategy extends Operation {
@Override
int doOperation(int x,int y) {
return x+y;
}
}
//减法运算
public class subOperationStrategy extends Operation{
@Override
double doOperation(double x, double y) {
return x-y;
}
}
//乘法运算
public class mulOperationStrategy extends Operation{
@Override
double doOperation(double x, double y) {
return x*y;
}
}
//除法运算
public class divOperationStrategy extends Operation{
@Override
double doOperation(double x, double y) {
return x/y;
}
}
环境类:
//环境类 保存具体策略类的具体实例 并 提供一个方法调用具体策略的具体算法
public class OperationContext {
private Operation strategy; //保存具体策略
private double x; //要进行运算的参数
private double y; //要进行运算的参数
public OperationContext(Operation strategy,double x,double y) { //构造方法
this.strategy = strategy;
this.x=x;
this.y=y;
}
//返回计算后的结果
public double executeOperation(){
return strategy.doOperation(x,y); //策略中的具体算法,对数据进行具体计算
}
}
客户端使用:
public class app {
public static void main(String[] args) {
OperationContext context;
//启用加法算法
context = new OperationContext(new addOperationStrategy(),5.0,5.0);
System.out.println("加法:x+y="+context.executeOperation());
//切换到减法算法
context = new OperationContext(new subOperationStrategy(),8.0,4.0);
System.out.println("减法:x-y="+context.executeOperation());
//切换到乘法算法
context = new OperationContext(new mulOperationStrategy(),5.0,5.0);
System.out.println("乘法:x*y="+context.executeOperation());
//切换到除法算法
context = new OperationContext(new divOperationStrategy(),5.0,5.0);
System.out.println("除法:x/y="+context.executeOperation());
}
}