面试八股之设计模式3.2——模式策略——策略模式综合案例原版

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥专栏:史上最强八股文||Java项目

🔥温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

🔥本篇概览:详细讲解了策略模式综合案例。


一句话总结

只要代码中有冗长的 if-else 或 switch 分支判断都可以采用策略模式优化。

2.4 综合案例

2.4.1 概述

下图是gitee的登录的入口,其中有多种方式可以进行登录

  • 用户名密码登录

  • 短信验证码登录

  • 微信登录

  • QQ登录

  • ....

2.4.2 目前已实现的代码

(1)登录接口

说明
请求方式POST
路径/api/user/login
参数LoginReq
返回值LoginResp

请求参数:LoginReq

@Data
public class LoginReq {
​
    private String name;
    private String password;
​
    private String phone;
    private String validateCode;//手机验证码
​
    private String wxCode;//用于微信登录
    /**
     * account : 用户名密码登录
     * sms : 手机验证码登录
     * we_chat : 微信登录
     */
    private String type;
}

响应参数:LoginResp

@Data
public class LoginResp{
    private Integer userId;
    private String userName;
    private String roleCode;
    private String token; //jwt令牌
    private boolean success;
​
}

控制层LoginController

@RestController
@RequestMapping("/api/user")
public class LoginController {
​
    @Autowired
    private UserService userService;
​
​
    @PostMapping("/login")
    public LoginResp login(@RequestBody LoginReq loginReq){
        return userService.login(loginReq);
    }
}

业务层UserService

@Service
public class UserService {
​
    public LoginResp login(LoginReq loginReq){
​
        if(loginReq.getType().equals("account")){
            System.out.println("用户名密码登录");
​
            //执行用户密码登录逻辑
​
            return new LoginResp();
​
        }else if(loginReq.getType().equals("sms")){
            System.out.println("手机号验证码登录");
​
            //执行手机号验证码登录逻辑
​
            return new LoginResp();
        }else if (loginReq.getType().equals("we_chat")){
            System.out.println("微信登录");
​
            //执行用户微信登录逻辑
​
            return new LoginResp();
        }
        LoginResp loginResp = new LoginResp();
        loginResp.setSuccess(false);
        System.out.println("登录失败");
        return loginResp;
    }
}

注意:我们重点讲的是设计模式,并不是登录的逻辑,所以以上代码并没有真正的实现登录功能

(2)问题分析

  • 业务层代码大量使用到了if...else,在后期阅读代码的时候会非常不友好,大量使用if...else性能也不高

  • 如果业务发生变更,比如现在新增了QQ登录方式,这个时候需要修改业务层代码,违反了开闭原则

解决:

使用工厂方法设计模式+策略模式解决。



💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏推荐

🌈🌈计算机科学入门系列                     关注走一波💕💕

🌈🌈CSAPP深入理解计算机原理        关注走一波💕💕

🌈🌈微服务项目之黑马头条                 关注走一波💕💕

🌈🌈redis深度项目之黑马点评            关注走一波💕💕

🌈🌈Java面试八股文系列专栏            关注走一波💕💕

🌈🌈算法leetcode+剑指offer              关注走一波💕💕


                                        


📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

  • 32
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是指用于解决软件设计问题的可重复利用的解决方案。它们通常与面向对象设计和编程相关,并具有非常实用的特征。Java设计模式的应用非常广泛,包括Java SE API,企业级Java应用程序,Java EE Web应用程序,移动应用程序等。 八股是指常见问题的标准答案,在Java设计模式中也有相关的八股,以下为Java设计模式八股: 1. 单例模式 在系统中只存在一个特定的实例。使用私有的构造函数,将构造函数私有化,防止直接创建实例。全局持有一个实例,提供一个公共的静态方法获取该实例。 2. 工厂模式 通过一个工厂类选择特定的对象创建方式,而不是直接实例化一个对象。对于需要频繁添加新的对象的系统来说,具有极大的灵活性。 3. 抽象工厂模式 与工厂模式相似,但它创建一组相关或依赖对象。因此,它不仅返回单个对象,而且返回对象集。 4. 适配器模式 将现有接口转化为另一个客户需求的接口。适配器可以重用不兼容的接口并且对系统兼容性没有负面影响。 5. 装饰模式 在不改变原始对象的情况下,动态地扩展一个对象的功能。装饰器类与其所装饰的对象具有相同的接口,因此装饰器可以取代该对象以满足客户需求。 6. 观察者模式 使对象被动地得知其他对象的改变。被观察者维护观察者列表,并在状态发生变化时通知所有观察者。 7. 策略模式 根据需要从一组算法中选择一个算法来完成指定任务。被选择的算法可以由程序在运行时动态地更改。 8. 建造者模式 与工厂模式相似,只是在生成对象时,逐步递进地构建一个复杂的对象。通过更好地组织复杂对象的构造过程,简化了对象的创建和维护。 以上八股是Java设计模式中最应用最广泛的一些模式,深入理解和掌握这些模式,在实际应用系统中可以提高程序的重用性、扩展性和维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值