4.6 备忘录
备忘录模式别名 Token 意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 结构 参与者 Originator:原始对象 Caretaker:负责保存好备忘录 Memento:备忘录,存储原始对象的状态。备忘录实际上有两个接口,一个是提供给 Caretaker 的窄接口:它只能将备忘录传递给其它对象;一个是提供给 Originator 的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许 Originator 访问本备忘录的内部状态。 适用性 在以下情况下可以使用 Memento 模式: 必须保存一个对象在某一个时刻的状态,这样以后需要时它才能恢复到先前的状态。 如果一个用接口来让其他对象直接得到的这些状态,将会暴露对象的实现细节并破坏对象的封装性。 效果 保持封装边界。 简化了 Originator。 定义窄接口和宽接口。 使用和维护 Memento 的潜在代价。 相关模式 可以使用 Memento 存储 Command 的内部状态,以支持撤销操作。 Memen...
4.7 观察者
观察者模式别名 Dependency Publish-Subscribe 观察者模式好牛啊,在不同的代码层次有这不同的名称但是大同小异。 在java代码层就是观察着模式 在socket网络编程、IO编程中(netty、springWebFlux、sofarpc)就是Reactor模式 在操作系统中就是IO多路复用的一种策略 在UI框架中就是Listener,事件监听机制和响应机制 在Spring框架中也有事件监听模型。 在web网站开发中,被称为响应式编程。服务发现机制。以下并不是观察者模式的范畴,是一种更加宏观的机制,可能使用了观察者模式去发现。 javaSPI。服务提供者接口 在微服务中就是注册中心的发布订阅过程。发布者订阅者、提供者消费者。 在消息中间件中就是发布订阅模式。https://juejin.cn/post/6993999863159455752 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 结构 参与者 Subject Subject 知道它的 Observer。可以有任意多个 O...
4.8 状态
意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构 参与者 Context 定义客户感兴趣的接口。 维护一个 ConcreteState 子类的实例,这个实例定义当前状态。 State 定义一个接口以封装与 Context 的一个特定状态相关的额行为。 ConcreteState 每一个子类实现一个与 Context 的一个状态相关的行为。 适用性 在以下情况下可以使用 State 模式: 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。 效果 它将与特定状态相关的行为局部化。 它使得状态转换显式化。 State 对象可被共享。 相关模式 使用 Flyweight 模式共享状态对象。 使用 Singleton 模式实现状态对象。 Implementation糖果销售机有多种状态,每种状态下销售机有不同的行为,状态可以发生转移,使得销售机的行为也发生改变。 123456789...
C 设计模式概述-行为型
三、行为型 1. 责任链(Chain Of Responsibility) Intent Class Diagram Implementation JDK 2. 命令(Command) Intent Class Diagram Implementation JDK 3. 解释器(Interpreter) Intent Class Diagram Implementation JDK 4. 迭代器(Iterator) Intent Class Diagram Implementation JDK 5. 中介者(Mediator) Intent Class Diagram Implementation JDK 6. 备忘录(Memento) Intent Class Diagram Implementation JDK 7. 观察者(Observer) Intent Class Diagram Implementation JDK 8. 状态(State) Intent Class Diagram Implementation 9. 策略(Stra...
06 面向对象的三大特征
面相对象的三大特征 1封装 2 继承 3 多态 4 重写、重载、重定义 定义 重写的原则 与重载的区别 方法访问的优先级 面相对象的三大特征1封装高内聚、低耦合。属性私有。 隐藏实现的细节。将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 提高系统的安全性。在getset中对输入数据进行安全检查。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。 提供统一的接口 更容易理解与维护。 实现封装的步骤 修改属性的可见性来限制对属性的访问(一般限制为private) 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问。get/set方法 2 继承继承的定义 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 继承本质上是一种代码复用的方法。也提高了代码的耦合程度。 所有没有父类的类默认继承Object类。 12345class 父类 {} cla...
Java 虚拟机
Java 虚拟机 Java 虚拟机 一、运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 二、垃圾收集 判断一个对象是否可被回收 引用类型 垃圾收集算法 垃圾收集器 三、内存分配与回收策略 Minor GC 和 Full GC 内存分配策略 Full GC 的触发条件 四、类加载机制 类的生命周期 类加载过程 类初始化时机 类与类加载器 类加载器分类 双亲委派模型 自定义类加载器实现 参考资料 十四、Java 虚拟机Java 内存结构堆栈垃圾回收JVM 内存区域Java 虚拟机栈class 文件字节码指令JVM 参数调优Java 对象模型HotSpot类加载机制编译和反编译反编译工具(javap)JIT虚拟机性能监控和故障处理工具(jps、jstack、jmap、jstat、jconsole、javap)https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV1DJ411B7cG%3Ffrom%3Dsearch%26seid%3D...
Linux
Linux Linux 前言 一、常用操作以及概念 快捷键 求助 关机 PATH sudo 包管理工具 发行版 VIM 三个模式 GNU 开源协议 二、磁盘 磁盘接口 磁盘的文件名 三、分区 分区表 开机检测程序 四、文件系统 分区与文件系统 组成 文件读取 磁盘碎片 block inode 目录 日志 挂载 目录配置 五、文件 文件属性 文件与目录的基本操作 修改权限 默认权限 目录的权限 链接 获取文件内容 指令与文件搜索 六、压缩与打包 压缩文件名 压缩指令 打包 七、Bash 特性 变量操作 指令搜索顺序 数据流重定向 八、管道指令 提取指令 排序指令 双向输出重定向 字符转换指令 分区指令 九、正则表达式 grep printf awk 十、进程管理 查看进程 进程状态 SIGCHLD wait() waitpid() 孤儿进程 僵尸进程 参考资料 前言为了便于理解,本文从常用操作和概念开始讲起。虽然已经尽量做到简化,但是涉及到的内容还是有点多。在面试中,Linux 知识点相对于网络和操作系统等知识点而言不是那么重要...
02 对象类型
数据类型 数据类型 0 数据类型 对象说明 对象代码实现 对象编码encoding 对象类型type 1 字符串对象STRING 字符串实现 编码的转换 字符串命令 2 列表对象LIST 列表实现 编码转换 列表命令 3 哈希对象HASH 哈希实现 编码转换 哈希命令 4 集合对象SET 集合实现 编码的转换 集合命令 5 有序集合的对象ZSET 编码的转换 有序集合命令 6 类型检查与命令多态 7 内存回收 8 对象共享 9 对象的空转时长 0 数据类型关于数据类型的说明。从C++标准库的角度来说,实现的数据结构主要可以如下方式进行划分 线性数据结构 vector(数组) list(链表) deque(双端队列) 非线性数据结构 set(集合) set红黑树实现的有序set unordered_set哈希实现的无序的set map(映射map、字典dict、哈希hash) map红黑树实现的有序map unordered_set哈希实现的无序的map 扩展数据结构 stack(栈) queue(队列) priority_queue...
04 数据库
数据库1 数据库的实现服务器数据库Redis服务器负责与多个客户端建立连接,处理客户端的命令请求,在数据库中保存命令产生的数据,并通过资源管理来维持服务器自身的运转。 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库: 12345678910struct redisServer { // ... redisDb *db; int dbnum; // 数据库的数量 // ... list *clients; redisClient *lua_client; // Lua伪客户端,服务器运行时一直存在 // ... // ...}; 其中dbnum的值有服务器配置的database选项决定,默认为16。 redisServer结构保存了一个clients链表,保存了所有连接的客户端的状态信息。 客户端数据库默认情况下,Redis客户端的目标数据库是0号数据库,客户端可以执行SE...
05 生命周期
生命周期1 数据库键生命周期概述Redis 可以为每个键设置过期时间,当键过期时,会自动删除该键。 对于散列表这种容器,只能为整个键设置过期时间(整个散列表),而不能为键里面的单个元素设置过期时间。 设置键的生存时间或过期时间EXPIRE或PEXPIRE命令让客户端可以以秒或者毫秒进度为某个键设置生存时间。经过指定的时间后,服务器会自动删除生存时间为0的键。 EXPIREAT或PEXPIREAT命令,以秒或毫秒精度为某个键设置过期时间,过期时间是一个UNIX时间戳。 TTL和PTTL命令可查看某个键的剩余生存时间。 实际上,EXPIRE、PEXPIRE、EXPIREAT三个命令都是使用PEXPIREAT来实现的。 保存过期时间redisDb结构的expires字典保存了所有键的过期时间: 过期字典的键是一个指针,指向键空间中的某个键对象。 过期字典的值是一个long long类型的整数,保存了一个UNIX时间戳。 12345typedef struct redisDb { // ... dict *expires; // ...} redisDb; ...














