设计模式-09
九.审计日志和 es 滚动查询
1.模版方法模式
模板方法模式确实非常简单,仅仅使用了 Java 的继承机制,但它是一个应用非常广泛的模式。其中,AbstractClass 叫做抽象模板,它的方法分为两类:
基本方法:
基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。模板方法:
可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
注意 为了防止恶意的操作,一般模板方法都加上 final 关键字,不允许被覆写。
2.需求
项目需求:
公司 财务、审计、法务部门需要记录用户关键核心日志,防止日后未知的纠纷。
要求:
-
该日志记录不是普通的日志记录,不同的日志记录内容可能不一样
-
可以灵活增加日志种类和处理;
-
核心日志包括: 登录; 订单创建; 订单支付。其中订单创建需要有相关产品信息;订单支付需要有相关产品信息以及支付方式和支付金额。
-
日志组装完成后,将日志信息发送到 queue 中,会由数据处理部门进行处理。
3.使用总结
- 创建日志的实体类;
- 创建日志的抽象类,编写抽象方法,和不被复写的方法;
- 编写日志,订单,支付日志处理器,复写自己的详细的 detail 信息;
- 使用到了模版方法模式;
4.迭代器模式
- Iterator 抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口
- ConcreteIterator 具体迭代器 具体迭代器角色要实现迭代器接口,完成容器元素的遍历。
- Aggregate 抽象容器 容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似 createIterator()这样的方法,在 Java 中一般是 iterator()方法。
- Concrete Aggregate 具体容器 具体容器实现容器接口定义的方法
5.需求
项目需求:
数据从 mysql 迁移至 Es,Es 数据查询的默认 fetchSize 最大为 10000. 如果查询超过 10000 条数据,需要通过 scroll 形式进行查询。
要求:
-
出于安全问题考虑,查询需要直连 ES-ip:9200, 不可使用第三方 Jar 包。
-
由于目前项目的查询方式是基于 mysql 的,为了减少改动,暂时使用 SQL 语句查询,ES-IP:9200/_sql
-
我们需要将结果以 stream 的形式进行返回。(避免我们的内存占用过大以及瞬时的网络带宽问题。)
6.使用总结
- 创建查询条件类和结果类;
- 创建迭代查询处理器,里面封装了迭代的逻辑;
- 使用到了迭代器模式;
- 迭代器模式场景较为特殊;
7.第三方账号登录原理
自建账号体系的注册和登录,对用户来讲,过程很繁琐,结果 很多用户并不想注册你开发的网站或 APP, 所以用户量增长缓慢。此时可考虑用第三方账号登录,比如微信登录和 QQ 登录。
当用户点击第三方登录时,会跳转到第三方登录 SDK 内部;用户输入第三方登录用户名或密码,有些第三方登录平台,可以直接调用已经登录的账号,例如:QQ;完成第三方平台登录的;登录完成后,第三方平台,或者 SDK
会回调我们的应用,在回调的信息里面,可以拿到用户在第三方平台的 OpenId,以及昵称,头像等信息。
8.桥接模式
桥接模式,是一个比较简单的模式。
- Abstraction——抽象化角色 它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
- Implementor——实现化角色 它是接口或者抽象类,定义角色必需的行为和属性。
- RefinedAbstraction——修正抽象化角色 它引用实现化角色对抽象化角色进行修正。
- ConcreteImplementor——具体实现化角色 它实现接口或抽象类定义的方法和属性。
桥梁模式的优点:
- 抽象和实现分离
- 优秀的扩充能力
- 实现细节对客户透明
9.多种类第三方账号登录
使用桥接模式
项目需求:
为了简化用户的登录注册流程,允许用户直接使用经过授权的第三方账号登录网站。
要求:
- 遵循开闭原则:可以新增抽象部分和实现部分,且它们之间不会互相影响。
- 遵循单一职责原则:抽象部分专注于处理高层逻辑,实现部分处理平台细节。
10.使用总结
- 创建登录接口;
- 支付宝登录,微博登录实现登录接口;
- 创建登录处理器抽象类,构造器需要登录接口,提供执行登录的抽象方法;
- 封装到第三方类的处理中,对外暴露抽象类,屏蔽接口实现细节;
- 使用到了桥接模式;
- 第三方登录也可以使用适配器模式;
- 点赞
- 收藏
- 关注作者
评论(0)