一个登录案例,学会委派设计模式!
点击关注公众号,Java干货及时送达
作者:叁滴水
博客:https://blog.csdn.net/qq_30285985/
前言
委派模式不属于23种设计模式,但是spring中出现了委派模式的影子,委派模式从字面上即可大概想到这个模式的含义,即想做有些事,但是我自己不想做,那么我委派给你做。
老板让经理去做一个项目,经理肯定不会亲自去做,会合理的安排给自己的手下去完成这个项目。这时委派模式的含义就比较清楚了。
网上太多老板安排经理做事的例子,在此!
一、登录案例
适配器模式也是通过登录进行示例的。但是设计模式总是多个结合使用的,单单使用适配器模式会显得有一点点的瑕疵。
比如,如果每种方式登录成功之后要设置登录的日志信息,并且每种登录方式的token生成策略如果不一样的话,单个的适配器模式是无法使得代码更加美观。
引入委派模式,可以认为是当前对象知道要做某些事,但是却不会具体的实现,好比经理知道每天的任务,但是具体实现的时候要交给自己的小弟去做。
代码如下(抽象类):
public abstract class AbstractLoginService {
public void login(UserInfo user){
System.out.println("账号密码登录");
UserInfo userInfo = userMapper.getUserInfo(user.getUserName(),user.getPassword());
this.getToken();
this.sendLog();
// 等等各种操作此处省略
}
// 设置登录日志
public abstract void sendLog();
// 获取token
public abstract void getToken();
}
创建抽象类,创建抽象方法sendLog
和getToken
,子类继承抽象类,实现抽象方法。最新 Java 核心技术教程,推荐大家阅读。
代码如下(短信登录示例):
public class SmsLoginService extends AbstractLoginService {
//手机号
//验证码
@Override
public void login(UserInfo user){
System.out.println("短信登录");
//验证验证码是否正确
this.checkCode(user.getMobile(),user.getCode());
UserInfo userInfo = null;//this.userMapper.getUserInfo(user.getMobile());
super.login(userInfo);
}
@Override
public void sendLog() {
System.out.println("这里设置短信登录日志信息");
}
@Override
public void getToken() {
System.out.println("获取短信登录token");
}
private void checkCode(String mobile, String code) {
System.out.println("验证验证码");
}
}
子类实现抽象方法后,可以实现不同的登录方式的发送登录日志和获取token的实现各不相同。
总结
委派模式即一件事情(或一个请求)对象本身不知道怎样处理,对象把请求交给其它对象来做。
在spring源码中可以看到更多委派模式的代码示例,
例如:
AbstractApplicationContext
类中obtainFreshBeanFactory
方法中的refreshBeanFactory
方法,和我这个例子类似,主类不关注或者说不知道如何实现refreshBeanFactory
方法,交给子类实现,达到了委派的效果。DispatcherServlet
这个springMVC的前端控制器或者说这就是一个转发器。所有的信息都会经过这个类,但是这个类缺只是转发,具体实现委派给了HandlerMapping
、视图解析器等等。达到了委派的效果。
另外,想学习更多的策略模式,可以关注公众号Java技术栈,在后台回复:设计模式,可以获取我整理的设计模式教程,都是实战干货。
本文来自作者「叁滴水」投稿,谢谢分享,也欢迎爱好技术分享的各位技术朋友向「Java技术栈」投稿,让更多人看到,投稿方式:关注公众号「Java技术栈」在后台回复:投稿。
关注Java技术栈看更多干货