策略模式
能做什么用
举个例子:在登陆CSDN时候发现,有账号密码登陆、微信登陆等等好多种方式可以登录,在程序员开发时候无法避免的就是,为每一种登录方式写一种验证登录成功的方法,比如:
if (userName == "DifferentWang" && password == "differ123456"){
// 提示登录成功!
}
这个账号密码登录的验证方式是不太适合用来验证微信登录的(不说的那么复杂,至少微信登录没输入用户名和密码),那自然要在写一个对应微信验证登录的方法。
那代码可能是这样的:在一个ValidateLogin .java的类中
public class ValidateLogin {
// 1、账号密码登录
public void usernameAndPassword(String username, String password){
// 验证逻辑
}
// 2、微信登录
public void wechatLogin(){
// 验证逻辑
}
// 3、微博登录
// 登录方法...
// n、其他登录方法
// ...
}
当调用时,
// ...
ValidateLogin validateLogin = new ValidateLogin();
validateLogin.wechatLogin();
// ...
在这里,重点不是如何实现各种登录方式的验证,也不是通过策略模式可以减少代码量。重点是,如果其他登录方式由你的同事编写,那我不想让他改动我的ValidateLogin类,但是其他方式又都属于验证登录,理应写在这个类中,我该怎么办?
呼~~~终于绕回来啦······(感觉这个例子好牵强,后给说应用场景就能更深入理解啦!)
接下来,有请我们的“策略模式”闪亮登场。music~
策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
如: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。
—— 菜鸟教程
优点:
1、各种策略可以自由替换
2、避免了多重条件判断(if…else if … else if… )
3、扩展性好
缺点
1、会产生很多策略类
2、所有策略类都要向外暴露
假设场景
开发一个简单计算器,只提供了有限的运算操作,但是该计算器可以让开发者进行二次开发,让其自己添加比如开方等等其他运算方法。——使用策略模式
需要怎么做
1、定义一个接口类
public interface Operation {
int doOperation(int num1, int num2);
}
2、实现接口,在每个实现类的doOperation()中实现对应操作的逻辑
a.实现加法类
public class AddOperation implements Operation {
@Override
int doOperation(int num1, int num2) {
return num1 + num2;
}
}
a.实现减法类
public class SubOperation implements Operation {
@Override
int doOperation(int num1, int num2) {
return num1 - num2;
}
}
3、定义计算器类
public class Calculator {
private Operation operation;
void setOperator(Operation operation) {
this.operation = operation;
}
int doOperation(int num1, int num2) {
return this.operation.doOperation(int num1, int num2);
}
}
4、调用计算器
public class CalculatorDemo
public static void main(String[] arg) {
Calculator calculator = new Calculator();
calculator.setOperation(new AddOperation());
int result = calculator.doOperation(1,2);
System.out.println("结果为:" + result);
}
}
可以用在什么场景下
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。(比如,计算器的加减乘除)
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意:
如果一个系统的策略多于四个,就需要考虑使用混合模式1,解决策略类膨胀的问题。
混合使用多种模式灵活搭配能让系统更健壮,灵活性更高,扩展性更强。 ↩︎