《Head First 设计模式》学习笔记---策略模式实现用户登录

一. 使用场景

1.1 改造背景

        平时工作应该都处理过用户登录的需求, 传统的写法是这样的, controller --> service --> mysql, 如果出现多种用户登录类型, 那么service层的代码就会变成这样,  这种写法很简单, 但是如果哪天增加了新的登录方式, 且不止一种, 那么就要在下面增加很多else..if , 太多的else..if 语句影响阅读代码, 特别是对旧代码的修改, 很容易出现bug, 这就是违背了面向对象最基本的设计原则 : 开闭原则, 也就是对修改关闭, 对拓展开放

    @Override
    public UserInfo doUserLogin(UserInfo userInfo) {
        if (UserLoginTypeEnum.BOSS_LOGIN.equals(type)) {
            // 老板登录
        } else if (UserLoginTypeEnum.STORE_LOGIN.equals(type)) {
            // 顾客登录
        }
        // 等多的登录类型
    }

二. 改造方案

2.1 策略模式

        那如何设计代码, 既可以增加新的登录功能, 又不会修改原有代码? 最近在研究设计模式, 使用 策略模式, 就可以很好地解决问题, 在《head first 设计模式》书中是这样描述策略模式的 : 策略模式定了了算法族, 分别封装起来, 让他们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户

        我们来看策略模式的类图

2.2 根据类图设计接口

        该接口定义了总策略, 具体实现哪一种策略要根据它的实现类决定

package com.demo07.strategy;

import com.demo07.model.UserInfo;
import com.demo07.service.UserService;

/**
 * 用户登录策略
 * @author canxiusi.yan
 * @description UserLogin
 * @date 2022/2/13 15:56
 */
public interface UserLogin {

    /**
     * 用户登录, 返回该用户信息
     * @return
     */
    UserInfo doLogin(UserInfo userInfo, UserService userService);
}

2.3 设计实现类

        老板登录策略

/**
 * @author canxiusi.yan
 * @description BossUserLogin
 * @date 2022/2/13 16:04
 */
@Component("boss")
public class BossLoginStrategy implements LoginStrategy {

    @Override
    public BaseRspVo<UserModel> doLogin(UserLoginRequest userLoginRequest) {
        // 模拟查询DB
        UserModel bossUser = UserModel.builder().name("managerUser").id("2").build();
        return BaseRspVo.successInstance(bossUser);
    }
}

        顾客登录策略

/**
 * 具体策略
 * @author canxiusi.yan
 * @description StoreUserLogin
 * @date 2022/2/13 15:57
 */
@Component("store")
public class StoreLoginStrategy implements LoginStrategy {

    @Override
    public BaseRspVo<UserModel> doLogin(UserLoginRequest userLoginRequest) {
        UserModel storeUser = UserModel.builder().name("storeUser").id("1").build();
        return BaseRspVo.successInstance(storeUser);
    }
}

        controller 调用

/**
 * @author canxiusi.yan
 * @description UserController
 * @date 2022/2/13 16:05
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    ApplicationContext applicationContext;

    @PostMapping("/doLogin")
    public BaseRspVo<UserModel> doStoreLogin(@RequestBody UserLoginRequest userLoginRequest) {
        LoginStrategy loginStrategy = applicationContext.getBean(userLoginRequest.getLoginTypeEnum().getType(), LoginStrategy.class);
        return loginStrategy.doLogin(userLoginRequest);
    }
}

2.4 总结

        这样一来, 如果后续增加新的登录方式, 只需要增加新的策略实现类去实现 LoginStrategy 接口,  而不用修改原有的代码, 甚至不用关心旧代码是怎么实现的, 很好的遵循了设计原则

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《Head First设计模式-深入浅出设计模式》是一本以简单有趣的方式介绍设计模式的书籍。设计模式是在软件开发中解决特定问题的一种经验总结,它们提供了在实际开发中可重用、可靠、灵活的解决方案。 该书的主要特点是通过生动有趣的讲解和丰富多样的图表、示例来帮助读者更好地理解和应用设计模式。作者采用了大量的图形和实例来解释设计模式的概念,使读者能够迅速理解并应用这些概念。 这本书涵盖了23种常用的设计模式,如工厂模式、单例模式、适配器模式、装饰器模式等。每一种设计模式都以一个实际的例子开始,引出该模式解决的问题,然后详细解释其结构和应用,最后通过示例代码展示如何使用该模式。 此外,该书还介绍了设计模式之间的关系和如何选择合适的设计模式。它教授了读者如何在具体问题中识别出适用的设计模式,并提供了一些实际的应用建议。 《Head First设计模式-深入浅出设计模式》以其独特的教学风格和简洁明了的讲解深受读者喜爱。这本书不仅适合初学者了解设计模式,也适合有一定经验的开发人员进一步提高他们的软件设计和编程能力。 总之,这本书以其生动有趣的讲解方式和大量的图表、实例为读者介绍了设计模式的基本概念和具体应用,是学习和理解设计模式的一本不可或缺的指南。 ### 回答2: 《Head First设计模式:深入浅出设计模式》是一本主要介绍软件设计模式的书籍。设计模式是在软件开发中经常出现的问题的解决方案,可以帮助开发人员更好地构建可重用、可扩展、可维护的代码。 这本书以深入浅出的方式介绍了23种常见的设计模式,通过生动有趣的讲解和大量的图形和实例,使读者能够更加轻松地理解和掌握设计模式。它采用了非传统的学习方式,通过讲故事、练习、谜题等方式将设计模式的概念和使用方法娓娓道来。 该书首先从简单的设计模式开始,引导读者逐步理解和掌握基础的设计原则和模式,如单例模式、工厂模式等。然后,逐渐深入介绍更复杂的模式,如装饰器模式、观察者模式策略模式等。每个模式都通过具体的案例和代码示例进行讲解,帮助读者理解模式的思想和应用场景。 除了具体的设计模式之外,这本书还关注了如何将设计模式应用到现实的软件开发中。它探讨了如何根据不同的需求选择合适的设计模式,以及如何通过设计模式提高代码的质量和可维护性。 总的来说,《Head First设计模式:深入浅出设计模式》是一本非常有趣、易懂且实用的设计模式入门书籍。无论是初学者还是有一定经验的开发人员,都能从中获得有益的知识和经验,提高软件开发的能力和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值