设计模式-18-备忘录模式
备忘录模式
备忘录模式保存一个对象的某个状态,以便在适当的时候恢复对象
备忘录模式属于行为型模式
意图:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:
所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:
很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态
如何解决:
通过一个备忘录类专门存储对象状态。
关键代码:
客户不与备忘录类耦合,与备忘录管理类耦合。
优点:
给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
实现了信息的封装,使得用户不需要关心状态的保存细节
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存
使用场景:
需要保存/恢复数据的相关状态场景
提供一个可回滚的操作。
注意事项:
为了符合迪米特原则,还要增加一个管理备忘录的类
为了节约内存,可使用原型模式+备忘录模 ...
设计模式-17-中介者模式
中介者模式
中介者模式是用来降低多个对象和类之间的通信复杂性
模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护
中介者模式属于行为型模式。
意图:
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要解决:
对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
何时使用:
多个类相互耦合,形成了网状结构。
如何解决:
将上述网状结构分离为星型结构。
关键代码:
对象 Colleague 之间的通信封装到一个类中单独处理。
优点:
降低了类的复杂度,将一对多转化成了一对一
各个类之间的解耦
符合迪米特原则。
缺点:
中介者会庞大,变得复杂难以维护。
使用场景:
系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项:
不应当在职责混乱的时候使用。
案例说明通过聊 ...
设计模式-16-观察者模式
观察者模式
观察者模式是一种行为型设计模式
它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。
当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它的对象。
意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:
使用面向对象技术,可以将这种依赖关系弱化。
关键代码:
在抽象类里有一个 ArrayList 存放观察者们。
优点:
观察者和被观察者是抽象耦合的
建立一套触发机制。
缺点:
如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃
观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么 ...
设计模式-15-迭代器模式
迭代器模式
迭代器模式是 Java 和 .Net 编程环境中非常常用的设计模式
用于顺序访问集合对象的元素,不需要知道集合对象的底层表示
迭代器模式属于行为型模式。
意图:
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:
不同的方式来遍历整个整合对象。
何时使用:
遍历一个聚合对象。
如何解决:
把在元素之间游走的责任交给迭代器,而不是聚合对象。
关键代码:
定义接口:hasNext, next。
应用实例:
JAVA 中的 iterator。
优点:
它支持以不同的方式遍历一个聚合对象
迭代器简化了聚合类
在同一个聚合上可以有多个遍历
在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景:
访问一个聚合对象的内容而无须暴露它的内部表示
需要为聚合对象提供多种遍历方式
为遍历不同的聚合结构提供一个统一的接口。
注意事项:
迭代器模式就是分离了集合对象的遍历行为 ...
企业开发进阶-6-Elasticsearch
1 初识 Elasticsearch
2 索引库操作
3 文档操作
4 RestAPI
5 RestClient操作文档
6 DSL查询文档
7 搜索结果处理
8 RestClient查询文档
9 酒店项目
10 数据聚合
11 自动补全
12 数据同步
13 ES集群
企业开发进阶-5-DockerBasic
Docker 简介Docker 官网(官方文档)Docker Hub 官网(镜像仓库)
Docker概念
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
Docker 是基于 Go 语言实现的云开源项目。Docker 的主要目标是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的 APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker 容器上面的实例,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机器上就可以一键部署好,大大简化了操作。
虚拟机和容器
传统虚拟机技术
虚拟机就是带环境安装的一种解决方案。可以在一种操作系统里面运行另一种操作系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的 ...