设计模式之策略模式

什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就策略模式简要概述。

什么是策略模式
策略模式就是一个类的算法和行为可以在运行的时候进行更改,属于行为型模式。

应用场景
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、测试结果

验证用户输入验证码
验证用户手机验证码
验证用户名称
验证用户密码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小沈同学呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值