回复
图解设计模式:身份认证场景的应用(二)
Handpc
发布于 2022-6-21 16:36
浏览
0收藏
责任链模式
在责任链模式中,多个处理器(参照拦截器)依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条,链条上的每个处理器 各自承担各自的处理职责
这里主要将责任链模式应用于,规避无意义调用三方认证服务
- 已认证过的人员信息,在有效期内没必要再次调用
- 调用认证结果错误,依然会扣钱,比如说名称中包含非中文,身份证格式错误等等
我们可以将处理器尽量职责单一,方便后续其它认证方式的 复用和编排
模板方法
模板方法模式在一个方法中定义一个 算法骨架,并将某些步骤推迟到 子类中实现。模板方法模式可以让子类在 不改变算法整体结构的情况下,重新定义算法中的某些步骤
模版方法主要作用:复用性 和 扩展性
- 复用性:核心思想就是 父级定义公共实现,由子级进行调取使用
- 扩展性:在不修改方法逻辑的前提下,变更其中的某些步骤
通俗来讲 : 定义一个抽象类 AbstractTemplate,并定义一个或若干抽象方法 abstractMethod。代码大致如下:
public abstract class AbstractAuthenticationService<T extends AuthenticationRequest> {
void before(T request) {
}
void after(T request) {
}
// 抽象方法
protected abstract void practicalExecute(T request);
public void authentication(T request) {
// 前置拦截操作,包括不限于责任链模式调用
before(request);
// 策略模式实现,调用具体认证类,比如二要素认证或三要素认证
practicalExecute(request);
// 资源清理或记录认证完成信息
after(request);
}
腾讯云二要素认证实现类,代码如下:
@Slf4j
@Component
@RequiredArgsConstructor
// BaseAuthenticationStrategy 是策略模式实现,定义了 mark、execute 方法
public class NameIdCardAuthenticationByTencentResolver extends AbstractAuthenticationService<NameIdCardAuthenticationReqDTO>
implements BaseAuthenticationStrategy<NameIdCardAuthenticationReqDTO> {
private static final String SUCCESS = "0";
// 责任链容器
private final NameIdCardHandlerChain nameIdCardHandlerChain;
@Override
public String mark() {
return AuthenticationEnum.TENCENT.name();
}
@Override
public void execute(NameIdCardAuthenticationReqDTO request) {
authentication(request);
}
@Override
public void before(NameIdCardAuthenticationReqDTO request) {
// 责任链调用
nameIdCardHandlerChain.doFilter(request);
}
@Override
public void practicalExecute(NameIdCardAuthenticationReqDTO request) {
// 腾讯云二要素认证具体行为
}
}
最后总结
抛出一个老生常谈的问题,学习设计模式有什么作用?
设计模式主要是为了应对 代码的复杂性,让其满足 开闭原则,提高代码的 扩展性;合适的场景合理运用的设计模式,可以帮助代码实现 高内聚、低耦合 等的优点
你无法决定别人的代码,但你可以决定自己的。时间充足的情况下,尽量以重构的方式去写每一行代码
因为篇幅问题,没有大张旗鼓讲设计模式本身,提供大家一个学习链接:https://github.com/acmenlt/framework
最后希望小伙伴读过文章后有所收获,祝好。
文章转自公众号:龙台的技术笔记
标签
已于2022-6-21 16:36:56修改
赞
收藏
回复
相关推荐