赞
踩
使用策略模式重构 if/else
策略设计模式是一种允许在运行时选择算法的行为。这种模式
● 定义了一系列算法
● 封装每种算法
● 使算法在该系列内可互换。
下面是策略设计模式的架构,客户端将在其中与上下文进行通信。上下文将包含对策略对象的引用,这反映了另一个设计原则 “针对接口而非实现编程”。
策略模式是指有一定行动内容的相对稳定的策略名称,策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
策略模式是一种行为设计模式,定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。目的是实现方法的使用和实现分开
日常开发中,对于需要考虑各类场景、各类分支通用逻辑时,就需要考虑是否可以将if-else switch 逻辑替换成不同策略算法进行单独处理,提高代码的可读性、可维护性,避免代码混乱熵增。
这里简单介绍一下lambda替换策略模式的方式:
对于Collections#sort() 的排序方法,使用何种排序策略来自于java.util.Comparator#compare() 中定义。
javax.servlet.http.HttpServlet#service()方法, 还有所有接受 HttpServletRequest和 HttpServletResponse对象作为参数的 doXXX()方法。根据HttpServletRequest.getMethod 获取请求方式(GET、POST、PUT …),用以路由处理各类请求策略。
如何识别是否是策略模式:通常策略模式可以通过允许嵌套对象完成实际工作的方法,允许将该对象替换为不同对象的设置器来识别
策略模式(Strategy Pattern)是设计模式中的一种行为型模式。它定义了一系列算法,将每个算法封装起来,并使它们可以互相替换。这种模式使得算法可以在不影响客户端的情况下发生变化。策略模式通过消除条件语句来实现算法的动态选择。
结构
策略模式有三个主要部分:
// Strategy Interface
public interface Strategy {
public int doOperation(int num1, int num2);
}
// Concrete Strategy A
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
// Concrete Strategy B
public class OperationSubstract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
// Concrete Strategy C
public class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
// Context Class
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
// Client Code
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.setStrategy(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context.setStrategy(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
优点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。