0%

基本概念

备忘录模式允许在不暴露对象实现的情况下捕获对象的内部状态,并在对象之外保存这个状态,仪表后续可以还原到之前的状态,有点类似Ctrl+Z

基本结构

备忘录模式包括一下几个重要角色:

  • 发起人Originator: 需要还原状态的那个对象,负责创建一个【备忘录】,并使用备忘录记录当前时刻的内部状态。
  • 备忘录Memento: 存储发起人对象的内部状态,它可以包含发起人的部分或全部状态信息,但是对外部是不可见的,只有发起人能够访问备忘录对象的状态。

备忘录有两个接口,发起人能够通过宽接口访问数据,管理者只能看到窄接口,并将备忘录传递给其他对象。

  • 管理者Caretaker: 负责存储备忘录对象,但并不了解其内部结构,管理者可以存储多个备忘录对象。
  • 客户端:在需要恢复状态时,客户端可以从管理者那里获取备忘录对象,并将其传递给发起人进行状态的恢复。

阅读全文 »

是什么

中介者模式也称为调停者模式,它通过一个中介对象来封装一组对象之间的交互,从而使这些对象不需要直接相互引用。这样可以降低对象之间的耦合度,使系统更容易维护和扩展。

当一个系统中的对象有很多且多个对象之间有复杂的相互依赖关系时,其结构图可能是下面这样的。

这种依赖关系很难理清,这时我们可以引入一个中介者对象来进行协调和交互。中介者模式可以使得系统的网状结构变成以中介者为中心的星形结构,每个具体对象不再通过直接的联系与另一个对象发生相互作用,而是通过“中介者”对象与另一个对象发生相互作用。

基本结构

中介者模式包括以下几个重要角色:

  • 抽象中介者(Mediator): 定义中介者的接口,用于各个具体同事对象之间的通信。
  • 具体中介者(Concrete Mediator): 实现抽象中介者接口,负责协调各个具体同事对象的交互关系,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
  • 抽象同事类(Colleague): 定义同事类的接口,维护一个对中介者对象的引用,用于通信。
  • 具体同事类(Concrete Colleague): 实现抽象同事类接口,每个具体同事类只知道自己的行为,而不了解其他同事类的情况,因为它们都需要与中介者通信,通过中介者协调与其他同事对象的交互。
阅读全文 »

是什么

命令模式允许将请求封装成一个对象(命令对象,包含执行操作所需的所有信息),并将命令对象按照一定的顺序存储在队列中,然后再逐一调用执行,这些命令也可以支持反向操作,进行撤销和重做。

这样发送者只需要触发命令就可以完成操作,不需要知道接受者的具体操作,从而实现两者间的解耦。

基本结构

  • 命令接口Command:接口或者抽象类,定义执行操作的接口。
  • 具体命令类ConcreteCommand: 实现命令接口,执行具体操作,在调用execute方法时使“接收者对象”根据命令完成具体的任务,比如遥控器中的“开机”,“关机”命令。
  • 接收者类Receiver: 接受并执行命令的对象,可以是任何对象,遥控器可以控制空调,也可以控制电视机,电视机和空调负责执行具体操作,是接收者。
  • 调用者类Invoker: 发起请求的对象,有一个将命令作为参数传递的方法。它不关心命令的具体实现,只负责调用命令对象的 execute() 方法来传递请求,在本例中,控制遥控器的“人”就是调用者。
    阅读全文 »

是什么

策略模式是一种行为型设计模式,他定义了一系列算法来使用不同的策略完成同一件工作,并将每个算法封装起来,使他们可以相互替换,而算法的变化不影响算法的使用。

比如电商网站对于商品的折扣策略会有不同的算法,比如新用户满减优惠,不同等级会员的折扣情况也不同,这种情况下会有大量的if-else,如果修改优惠政策,还要修改原来的代码,不符合开闭原则。

于是可以将不同的优惠算法封装成独立的类来避免大量的条件语句,如果新增优惠算法,也只需要添加新的策略类来实现,不需要修改原来的代码,调用的时候直接用不同的类来选择不同的优惠策略;

基本结构

策略模式包含一下几个结构:

  • 策略接口Strategy:定义了所有支持的算法的各个接口
  • 具体策略类ConcreteStrategy:实现了策略接口,提供具体的算法实现
  • 上下文类Context:包含一个策略实例,并在需要的时候可以调用策略对象的方法
阅读全文 »

二叉树的种类

常见的二叉树主要有两种形式,分别是:满二叉树和完全二叉树

满二叉树

满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。

阅读全文 »

常用元字符

代码 说明
. 匹配除换行(\r、\n)符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
[\s\S] 匹配所有,\s是匹配所有空白符,包括换行,\S非空白符不包括换行

常用限定符

代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
n 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

常用反义词

代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

选择

代码/语法 说明
exp1(?=exp2) 查找 exp2 前面的 exp1
(?<=exp2)exp1 查找 exp2 后面的 exp1
exp1(?!exp2) 查找后面不是 exp2 的 exp1
(?<!exp2)exp1 查找前面不是 exp2 的 exp1

学习资料

https://www.runoob.com/regexp/regexp-syntax.html

正则表达式在线测试

ThreadLocal简介

ThreadLocal顾名思义,就是线程局部变量,也可以叫线程变量。可以让不同的线程访问自己独有的变量,而不会影响其他线程变量,实现了线程隔离级别的变量存储。

常见的使用场景包括:

  • 会话管理:在web应用中,可以使用线程变量来存储请求中的相关信息,这样在后续处理请求的过程中都可以方便的获取到请求相关的信息,比如用户的相关信息。
  • 数据库连接管理:在并发访问数据库的场景下,使用线程变量管理数据库的连接,这样每个线程都有自己独立的数据库连接,避免线程之间数据不一致和连接冲突的问题。

工作原理

Thread类中有一个threadLocals的属性,这是一个ThreadLocalMap对象。ThreadLocalMap可以被看做是一个集合,其内部维护一个Entry[]数组,用来保存ThreadLocal的引用。

阅读全文 »

是什么

原型模式一种创建型设计模式,该模式的核心思想是基于现有的对象创建新的对象,而不是从头开始创建。

在原型模式中,通常有一个原型对象,它被用作创建新对象的模板。新对象通过复制原型对象的属性和状态来创建,而无需知道具体的创建细节。

为什么

如果一个对象的创建过程比较复杂时(比如需要经过一系列的计算和资源消耗),那每次创建该对象都需要消耗资源,而通过原型模式就可以复制现有的一个对象来迅速创建/克隆一个新对象,不必关心具体的创建细节,可以降低对象创建的成本。

基本结构

实现原型模式需要给【原型对象】声明一个克隆方法,执行该方法会创建一个当前类的新对象,并将原始对象中的成员变量复制到新生成的对象中,而不必实例化。并且在这个过程中只需要调用原型对象的克隆方法,而无需知道原型对象的具体类型。

阅读全文 »

是什么

建造者模式(也被成为生成器模式),是一种创建型设计模式,软件开发过程中有的时候需要创建很复杂的对象,而建造者模式的主要思想是将对象的构建过程分为多个步骤,并为每个步骤定义一个抽象的接口,具体的构建过程由实现了这些接口的具体建造者类来完成。同时有一个指导者类负责协调建造者的工作,按照一定的顺序或逻辑来执行构建步骤,最终生成产品。

例如加入我们创建一个计算机对象,而计算机由很多组件构成,例如CPU、内存、硬盘等,每个组件可能由不同的型号、配置和制造,这个时候计算机就可以被视为一个复杂对象,构造过程相对复杂,而我们使用建造者模式将计算机的构建过程封装在一个具体的建造者类中,而指导者则负责指导构建的步骤和顺序。

基本结构

建造者模式有以下几个关键角色:

  • 产品Product:被构建的复杂对象, 包含多个组成部分。
  • 抽象建造者Builder: 定义构建产品各个部分的抽象接口和一个返回复杂产品的方法getResult
  • 具体建造者Concrete Builder:实现抽象建造者接口,构建产品的各个组成部分,并提供一个方法返回最终的产品。
  • 指导者Director:调用具体建造者的方法,按照一定的顺序或逻辑来构建产品。

阅读全文 »

是什么

抽象工厂模式提供了一个创建一系列相关或相互依赖的对象接口,而无需指定他们的具体类。

在工厂方法模式中,每个具体工厂只负责单一产品的创建,但是如果有多类产品,那么这些具体的产品都需要创建一个单独的工厂类,但是他们都是相互关联的,都属于同一个品牌,这就可以使用“抽象工厂模式”。

抽象工厂模式可以确保一系列相关的产品被一起创建,这些产品能够相互配合使用,再举个例子,有一些家具,比如沙发、茶几、椅子,都具有古典风格的和现代风格的,抽象工厂模式可以将生产现代风格的家具放在一个工厂类中,将生产古典风格的家具放在另一个工厂类中,这样每个工厂类就可以生产一系列的家具。

基本结构

抽象工厂模式包含多个抽象产品接口,多个具体产品类,一个抽象工厂接口和多个具体工厂,每个具体工厂负责创建一组相关的产品。

  • 抽象产品接口AbstractProduct: 定义产品的接口,可以定义多个抽象产品接口,比如说沙发、椅子、茶几都是抽象产品。
  • 具体产品类ConcreteProduct: 实现抽象产品接口,产品的具体实现,古典风格和沙发和现代风格的沙发都是具体产品。
  • 抽象工厂接口AbstractFactory: 声明一组用于创建产品的方法,每个方法对应一个产品。
  • 具体工厂类ConcreteFactory: 实现抽象工厂接口,负责创建一组具体产品的对象,在本例中,生产古典风格的工厂和生产现代风格的工厂都是具体实例。
    阅读全文 »