什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就策略模式简要概述。
什么是策略模式
策略模式就是一个类的算法和行为可以在运行的时候进行更改,属于行为型模式。
应用场景
1、多个算法和行为需要在运行时确定
策略模式VS工程模式
1、策略模式需要向外部暴露策略类,单工厂模式不会;
2、策略模式避免了多判断语法,工厂模式在工厂里面一般会进行多条件判断实例化对象;
3、策略模式对象由外部传入,工厂模式对象由工厂内部产生从一开始就固定了对象行为
小结:一般工厂模式可以嵌套策略模式解决工厂内部多判断语句的问题。
优势与劣势
优点:
1、算法和行为可以自由切换
2、避免使用多判段语句,比如 if else
3、灵活便于扩展
缺点:
1、算法和行为都需要策略类,增加系统类个数
2、策略类需要外部暴露
小试牛刀
用户登录会有很多的验证,比如用户名、密码、验证码、短信验证码,每种验证都有相应的算法,不同的业务需求验证的策略也不一样。我们可以通过策略模式生成验证策略类,各个业务根据需求进行调用。如果后期增加新的验证规则,直接新增策略类进行调用即可。
我们定义四个验证策略类:
CheckUserByName、CheckUserByPassword、CheckUserByCode、CheckUserByPhoneCode
定义一个验证类:CheckFun
依赖关系为:
1、定义验证用户类
/**
* 用户对象
* @author senfel
* @version 1.0
* @date 2022/10/14 11:24
*/
@Data
public class User {
public User() {
}
public User(String name, String password, String code, String phoneCode) {
this.name = name;
this.password = password;
this.code = code;
this.phoneCode = phoneCode;
}
/**
* 名称
*/
private String name;
/**
* 密码
*/
private String password;
/**
* 验证码
*/
private String code;
/**
* 手机验证码
*/
private String phoneCode;
}
2、定义策略抽象接口及四大算法策略类
/**
* 验证用户的抽象接口
* @author senfel
* @version 1.0
* @date 2022/10/14 11:18
*/
public interface CheckUser {
/**
* 验证执行方法
*/
Boolean action(User user);
}
/**
* 验证用户名
* @author senfel
* @version 1.0
* @date 2022/10/14 11:19
*/
public class CheckUserByName implements CheckUser{
@Override
public Boolean action(User user) {
System.err.println(JSONObject.toJSONString(user));
System.err.println("验证用户名称");
return true;
}
}
/**
* 验证用户密码
* @author senfel
* @version 1.0
* @date 2022/10/14 11:20
*/
public class CheckUserByPassword implements CheckUser{
@Override
public Boolean action(User user) {
System.err.println(JSONObject.toJSONString(user));
System.err.println("验证用户密码");
return true;
}
}
/**
* 验证用户输入的验证码
* @author senfel
* @version 1.0
* @date 2022/10/14 11:22
*/
public class CheckUserByCode implements CheckUser{
@Override
public Boolean action(User user) {
System.err.println(JSONObject.toJSONString(user));
System.err.println("验证用户输入验证码");
return true;
}
}
/**
* 验证手机验证码
* @author senfel
* @version 1.0
* @date 2022/10/14 11:22
*/
public class CheckUserByPhoneCode implements CheckUser {
@Override
public Boolean action(User user) {
System.err.println(JSONObject.toJSONString(user));
System.err.println("验证用户手机验证码");
return true;
}
}
3、封装算法统一调用
/**
* 验证方法
* @author senfel
* @version 1.0
* @date 2022/10/14 11:29
*/
public class CheckFun {
/**
* 验证算法
*/
private CheckUser checkUser;
/**
* 用户
*/
private User user;
public CheckFun(CheckUser checkUser,User user) {
this.checkUser = checkUser;
this.user = user;
}
/**
* 执行验证算法验证用户
*/
public void checkAction(){
checkUser.action(user);
}
}
4、测试策略模式类
/**
* 策略模式测试
* @author senfel
* @version 1.0
* @date 2022/10/14 11:23
*/
@SpringBootTest
public class TestStrategyPattern {
@Test
public void test(){
//新增验证接受用户
User user = new User("senfel", "DGFMEWI0UGJJOIWEGI", "547811", "789412");
//验证输入验证码
CheckFun checkFun = new CheckFun(new CheckUserByCode(),user);
checkFun.checkAction();
//验证手机验证码
CheckFun checkPhone = new CheckFun(new CheckUserByPhoneCode(),user);
checkPhone.checkAction();
//验证用户名称
CheckFun checkName = new CheckFun(new CheckUserByName(),user);
checkName.checkAction();
//验证用户密码
CheckFun checkPassword = new CheckFun(new CheckUserByPassword(),user);
checkPassword.checkAction();
}
}
5、测试结果
验证用户输入验证码
验证用户手机验证码
验证用户名称
验证用户密码