• 策略模式:【利于扩展,消除if的模式】


    1.前言

    对于大多数多种类型的逻辑代码,我们一般的做法一般是通过if来进行判断,然后再{}里进行逻辑代码的编写,如下述

    1. package org.example.designpattern.strategy;
    2. public class LoginNoDesign {
    3. /**
    4. * 登录方法, 不使用策略模式时, 对于流程的扩展如新增一种登录方式只能添加if
    5. *
    6. * @param username 用户名
    7. * @param password 密码
    8. * @param type 登录方式
    9. */
    10. public void login(String username, String password, String type) {
    11. if ("mobile".equals(type)) {
    12. // 手机号登录
    13. System.out.println("手机号登录成功");
    14. } else {
    15. // 用户名密码登录
    16. System.out.println("用户名密码登录成功");
    17. }
    18. }
    19. }

    但这种代码给整个方法增添了一种臃肿,往往一个方法需要大几十甚至上百行代码。

    二.策略模式介绍

    策略模式是行为模式的一种,也是消除if的重要手段,通过对于同类逻辑的不同策略来实现替代,如我们有多种登陆方式,那么可以先定义某种type对应某种策略,在使用时通过type来获取对应执行策略。

    三.代码实现

    1. package org.example.designpattern.strategy;
    2. public interface ILogin {
    3. /**
    4. * 登录方法
    5. *
    6. * @param username 用户名
    7. * @param password 密码
    8. * @param type 登录方式
    9. */
    10. void login(String username, String password, String type);
    11. }
    1. package org.example.designpattern.strategy;
    2. public class MobileLogin implements ILogin{
    3. @Override
    4. public void login(String username, String password, String type) {
    5. System.out.println("手机号登录成功");
    6. }
    7. }
    1. package org.example.designpattern.strategy;
    2. public class UsernameLogin implements ILogin{
    3. @Override
    4. public void login(String username, String password, String type) {
    5. System.out.println("用户名密码登录成功");
    6. }
    7. }

    测试

    1. package org.example.designpattern.strategy;
    2. import org.junit.Test;
    3. public class StrategyTests {
    4. @Test
    5. public void test() {
    6. LoginNoDesign loginNoDesign = new LoginNoDesign();
    7. loginNoDesign.login("root", "root", "username");
    8. // 策略模式
    9. ILogin login = new MobileLogin();
    10. login.login("13903291525", "", "mobile");
    11. }
    12. }

    对比

    通过类型将各自实现分开,这样将原来的耦合的代码分开,在某种类型逻辑需要修改维护时也不需要测试其他已经跑通的逻辑。

    扩展

    结合工厂模式,预定义对应类型所执行的策略

    1. package org.example.designpattern.strategy;
    2. import java.util.Map;
    3. import java.util.concurrent.ConcurrentHashMap;
    4. public class LoginServiceFactory {
    5. private static Map<String, ILogin> loginMap = new ConcurrentHashMap<>();
    6. static {
    7. loginMap.put("mobile", new MobileLogin());
    8. loginMap.put("username", new UsernameLogin());
    9. }
    10. public static ILogin getLoginService(String type) {
    11. return loginMap.get(type);
    12. }
    13. }

    测试

    1. package org.example.designpattern.strategy;
    2. import org.junit.Test;
    3. public class StrategyTests {
    4. @Test
    5. public void test() {
    6. LoginNoDesign loginNoDesign = new LoginNoDesign();
    7. loginNoDesign.login("root", "root", "username");
    8. // 策略模式
    9. ILogin login = new MobileLogin();
    10. login.login("13903291525", "");
    11. // 结合工厂
    12. ILogin login1 = LoginServiceFactory.getLoginService("mobile");
    13. login1.login("13903291525", "");
    14. }
    15. }

    四.总结

    策略模式并不复杂,通过策略模式可以优化掉代码中的大量if,可以极大的提高系统的扩展性

     

  • 相关阅读:
    linux安装kafka教程
    Prometheus+Grafana可视化监控【主机状态】
    OSPF不规则区域
    【云原生】一篇打通微服务架构,nacos + gateway + Redis + MySQL + docker
    halcon双目标定双相机标定
    【洛谷 B2003】输出第二个整数 题解(顺序结构+输入输出)
    开启AI大模型时代|「Transformer论文精读」
    解析idea中的debug调试模式
    如何压缩jpg图片的大小?可以一键压缩图片的软件有哪些?
    SELinux零知识学习十七、SELinux策略语言之类型强制(2)
  • 原文地址:https://blog.csdn.net/LBWNB_Java/article/details/126259730