1.一个定义公共方法的接口
2.若干实现了接口的具体实现
3.上下文context,用于跟客户端和策略之间交互
公共接口:
package designpattern.strategy; public interface calculate { public double calculate(double num1, double num2); }
具体实现(加减乘除方法):
package designpattern.strategy; public class plus implements calculate { @override public double calculate(double num1, double num2) { return num1 + num2; } }
package designpattern.strategy; public class minus implements calculate { @override public double calculate(double num1, double num2) { return num1 - num2; } }
package designpattern.strategy; public class multiply implements calculate { @override public double calculate(double num1, double num2) { return num1 * num2; } }
package designpattern.strategy; public class divide implements calculate { @override public double calculate(double num1, double num2) { return num1 / num2; } }
上下文:
package designpattern.strategy; public class calculatecontext { calculate calculate; public calculatecontext(calculate calculate) { super(); this.calculate = calculate; } public double calculate(double num1, double num2) { return calculate.calculate(num1, num2); } }
客户端:
package designpattern.strategy; import java.util.scanner; public class calculator { public static void main(string[] args) { scanner scanner = new scanner(system.in); system.out.println("请输入一个数字"); double num1 = scanner.nextdouble(); system.out.println("请输入一个运算符:+、-、*、/"); string operator = scanner.next();// 不能用nextline(),会把上一个回车给吸收 system.out.println("请输入一个数字"); double num2 = scanner.nextdouble(); switch (operator) { case "+": system.out.println(new calculatecontext(new plus()).calculate(num1, num2)); break; case "-": system.out.println(new calculatecontext(new minus()).calculate(num1, num2)); break; case "*": system.out.println(new calculatecontext(new multiply()).calculate(num1, num2)); break; case "/": system.out.println(new calculatecontext(new divide()).calculate(num1, num2)); break; default: break; } scanner.close(); } }
这样的写法,还是把判断的任务交给了客户端。
可以稍加改善,把判断交给上下文context。
上下文:
package designpattern.strategy; public class calculatecontext2 { calculate calculate; public calculatecontext2(string operate) { super(); switch (operate) { case "+": this.calculate = new plus(); break; case "-": this.calculate = new minus(); break; case "*": this.calculate = new multiply(); break; case "/": this.calculate = new divide(); break; } } public double calculate(double num1, double num2) { return calculate.calculate(num1, num2); } }
客户端:
package designpattern.strategy; import java.util.scanner; public class calculator2 { public static void main(string[] args) { scanner scanner = new scanner(system.in); system.out.println("请输入一个数字"); double num1 = scanner.nextdouble(); system.out.println("请输入一个运算符:+、-、*、/"); string operator = scanner.next();// 不能用nextline(),会把上一个回车给吸收 system.out.println("请输入一个数字"); double num2 = scanner.nextdouble(); system.out.println(new calculatecontext2(operator).calculate(num1, num2)); scanner.close(); } }
这里使用了简单工厂模式的思想,传入一个参数,不管具体细节,获得所期望的对象,所以算是简单工厂模式和策略模式的结合。
策略模式能将我们从if-else中解放出来,当我们需要不停的写if-else的时候,可以想起策略模式。让我们的代码可扩展且更易于维护。
如对本文有疑问, 点击进行留言回复!!
荐 厉害了!阿里P8架构师用4大技术文档带你深入解读爆火的中台战略
FlowableException: Error initialising dmn data model报错问题
网友评论