设计模式-行为型-观察者模式(Observer)
参考文献
https://refactoringguru.cn/design-patterns/observer
https://www.oodesign.com/observer-pattern
https://java-design-patterns.com/patterns/observer/
观察者模式
定义对象之间的一对多依赖关系,以便当一个对象更改状态时,其所有依赖项都会收到通知并自动更新.
Model View Controller Pattern: 观察者模式用于模型视图控制器 (MVC) 架构模式.在 MVC 中,此模式用于将模型与视图解耦. View代表观察者,模型是Observable对象
Event management: 这是广泛使用观察者模式的领域之一. Swing 和.Net 广泛使用观察者模式来实现事件机制.
组件
Observable(Publisher): 定义将观察者附加到客户端和取消附加到客户端的操作的接口或抽象类.
ConcreteObservable: 具体的Observable类.它维护对象的状态,当状态发生变化时,它会通知附加的 ...
设计模式-行为型-迭代器模式(Iterator)
参考文献
https://www.oodesign.com/iterator-pattern
https://refactoringguru.cn/design-patterns/iterator
https://java-design-patterns.com/patterns/iterator/
图解设计模式 结城浩
迭代器模式
迭代器模式的思想是负责访问和传递集合的对象并将其放入迭代器对象中.迭代器对象将维护迭代的状态,跟踪当前项并具有识别下一个要迭代的元素的方法.
提供一种顺序访问聚合对象的元素而不暴露其底层表示的方法.
迭代器模式提供的抽象允许您修改集合实现,而无需在集合之外进行任何更改
组件
Iterator(迭代器) : 负责定义按顺序逐个遍历元素的接口.
ConcreteIterator(具体的迭代器) : 负责实现Iterator角色所定义的接口
Collection(集合) : 负责定义创建Iterator角色的接口.
ConcreteCollection(具体的集合) : 负责实现Collection角色所定义的接口.
实现方式
声明迭代器接 ...
设计模式-行为型-策略模式(Strategy)
参考文献
https://www.oodesign.com/strategy-pattern
https://java-design-patterns.com/patterns/strategy/
https://refactoringguru.cn/design-patterns/strategy
策略模式
定义一系列算法,封装每个算法,并使它们可以互换.策略使算法能够独立于使用它的客户端而变化.
组件
Strategy(策略): 定义所有支持的算法通用的接口. Context 使用此接口来调用 ConcreteStrategy 定义的算法.
ConcreteStrategy(具体策略): 每个具体策略都实现一个算法.它们实现了 Strategy 接口定义的方法,提供了不同的算法实现
Context(上下文)
包含对策略对象的引用.
可以定义一个接口,让策略访问其数据.
Context 对象包含对应使用的ConcreteStrategy 的引用.当需要执行操作时,算法将从策略对象运行.上下文不知道策略的实施.如有必要,可以定义附加对象以将数据从上下文对象传递到策略.
...
设计模式-行为型-备忘录模式(Memento)
参考文献
https://www.oodesign.com/memento-pattern
https://java-design-patterns.com/patterns/memento/
https://refactoringguru.cn/design-patterns/memento
备忘录模式
允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态.
组件
Memento 备忘录
存储 Originator对象的内部状态.状态可以包括任意数量的状态变量.
备忘录必须具有两个接口,一个接口用于负责人(Caretaker).这个接口不能允许任何操作或者访问备忘录存储的内部状态,从而遵循封装原则.另一个接口用于原发器(Originator),允许原发器访问任何必要的状态变量以恢复先前的状态
Originator 原发器
创建一个备忘录对象,用于捕获原发器的内部状态.
使用备忘录对象来恢复先前的状态.
Caretaker 负责人
负责保持备忘录.
备忘录对于负责人来说是不透明的,而负责人不能对其进行操作.
实现方式
确定担任原发器角色的类取决于你的 ...
设计模式-行为型-状态模式(State)
参考文献
https://refactoringguru.cn/design-patterns/state
https://java-design-patterns.com/patterns/state/
状态模式
允许对象在其内部状态发生变化时改变其行为
组件
状态接口(State Interface):定义了表示各种状态的方法,具体状态类必须实现该接口.
具体状态类(Concrete State Class):实现了状态接口的具体状态类,每个具体状态类负责处理特定的状态下的行为.
上下文类(Context Class):维护一个对当前状态对象的引用,提供了用于切换状态和执行相应操作的方法.
环境类状态切换方法(Transition Methods in Context Class):在上下文类中提供了用于切换状态的方法,允许客户端自行决定何时切换状态.
共享状态(Shared State):多个上下文对象共享同一个状态对象的情况.这种情况下,可以将状态对象设计成可共享的,以减少对象的创建和内存占用.
实现方式
定义状态接口(State Interface):创 ...
设计模式-创建型-命令模式(Command)
参考文献
https://www.oodesign.com/command-pattern
https://refactoringguru.cn/design-patterns/command
https://java-design-patterns.com/patterns/command/
命令模式
它可将请求转换为一个包含与请求相关的所有信息的独立对象. 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作.
组件
Command - 接口通常仅声明一个执行命令的方法.
ConcreteCommand - 会实现各种类型的请求. 具体命令自身并不完成工作, 而是会将调用委派给一个业务逻辑对象. 但为了简化代码, 这些类可以进行合并.
接收对象执行方法所需的参数可以声明为具体命令的成员变量. 你可以将命令对象设为不可变, 仅允许通过构造函数对这些成员变量进行初始化.
Client - 会创建并配置具体命令对象. 客户端必须将包括接收者实体在内的所有请求参数传递给命令的构造函数. 此后, 生成的命令就可以与一个或多个发送者 ...
读书笔记-MySQL技术内幕-SQL编程
参考文献
MySQL技术内幕-SQL编程 姜承尧
第四章 子查询
独立子查询
子查询可以按两种方式分类.若按照期望值的数量,可以将子查询分为标量子查询和多值子查询;若按查询对外部查询的依赖可分为独立子查询(self-contained subquery)和相关子查询(correlated subquery)
独立子查询是不依赖外部查询而运行的子查询.与相关子查询相比,独立子查询更便于SQL语句的调试.
标量子查询可以出现在查询中希望产生标量值的任何地方,而多值子查询可以出现在查询中希望产生多值集合的任何地方.只要标量子查询返回的是单个值或NULL值,就说明该子查询是有效的.如果标量子查询返回多个值,则,MySQL数据库将抛出错误.
EXISTS谓词
EXISTS是一个非常强大的谓词,它允许数据库高效地检查查询是否产生某些行.通常EXISTS的输入是一个子查询,并关联到外部查询,但这不是必须的.根据子查询是否返回行,该谓词返回TRUE或FALSE.
与其他谓词和逻辑表达式不同的是,无论输入子查询是否返回行,EXISTS都不会返回UNKNOWN.如果子查询的过滤器为某行返回 ...
读书笔记-深入理解Nginx-模块开发与架构解析(第二版)
参考文献
深入理解Nginx-模块开发与架构解析(第二版) 陶辉
第一部分 Nginx能帮我做什么
第一章 研究Nginx前的准备工作
Nginx的优点
高并发,高性能
高扩展性
高可靠性
热部署
最自由的BSD许可证
使用Nginx的必备软件
GCC编译器
1yum install -y gcc-c++
PCRE库
1yum install -y pcre pcre-devel
zlib库
1yum install -y zlib zlib-devel
OpenSSL开发库
1yum install -y openssl openssl-devel
磁盘目录
Nginx源代码存放目录
Nginx编译阶段产生的中间文件存放目录
该目录用于放置在configure命令执行后所生成的源文件及目录,以及make命令执行后生成的目标文件和最终连接成功的二进制文件.
默认情况下,configure命令会将目录命名为objs,并放在Nginx源代码目录下
部署目录
该目录存放实际Nginx服务运行期间所需要的二进制文件,配置文件等.
默认情况下,该目录为/us ...
读书笔记-Java并发编程设计原则与模式(第二版)
参考文献
<<Java并发编程 设计原则与模式(第二版)>> Doug Lea
第一章 面向对象的并发编程
Java编程语言提供的三种常用的并发构件
独占(Exclusion). 可以通过阻止多个并发行为间的有害干扰来维护对象状态的一致性.通常使用同步(synchronized)
状态依赖(State dependence).是否可以触发,阻止,延迟或是恢复某些行为是由一些对象是否处于这些行为可能成功或是成功的状态上决定的.通常,状态依赖关系使用监视器(monitor)方法实现,如Object.wait, Object.notify和Object.notifyAll.
创建线程(Create threads).使用线程(Thread)对象来创建和管理并发操作.
通过保证同步在同一个对象上的方法或者代码块操作的原子性(atomicity),加锁机制可以同时提供多种保护措施,包括对上层和底层冲突的保护.原子操作被作为一个整体来执行,这样它们就不会被插入的其他线程的操作打断.
第二章 独占
不变性
如果一个对象的状态不能改变,那么它永远不会遇到由于多个 ...
解决方案-认证与授权
参考文献
https://docs.authing.cn/v2/concepts/
https://datatracker.ietf.org/doc/html/rfc6749
行业标准
OAuth 2.0: 一种授权标准,允许用户在一个站点向其他站点授予对其资源的有限访问权限,而无需获得其凭证(通常是账号密码).举个例子,你在手机上点击「使用微信登录」时都会使用此标准,并且系统会询问你是否同意与该应用共享你的头像、昵称等数据.
Open ID Connect: 这是 OAuth 2.0 的一个超集,他在 OAuth 2.0 之上提供了更多用户信息和获取权限和标准,比如他定义了用户的头像为 picture.
JSON Web Tokens: 一种开放标准,主要用来安全的传输信息,他的格式非常紧凑和独立,解析之后是一种 JSON 格式.
Security Assertion Markup Language (SAML): 一种基于 XML 的开放数据格式,SAML 允许企业应用程序和内部、外部程序无缝连接.
LDAP: 可以把轻量目录访问协议(Lightweight Director ...