设计模式-备忘录、观察者

120 阅读4分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、 备忘录模式

定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

理解: 备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。例如记事本的撤销操作、数据库事务中的回滚操作、手机的备份操作等。备忘录模式包含3个角色,发起人角色负责创建一个备忘录来记录当前对象的状态,可使用备忘录恢复内部状态;备忘录角色负责存储发起人的内部状态,防止其他对象访问备忘录,并在需要的时候提供这些状态给发起人;管理者角色负责备忘录的权限管理,不能访问或者修改备忘录的内容。

优点: 提供一种恢复机制,可以将数据恢复到某个历史状态;把发起人内部信息封装,除了发起人,其他对象都不能访问;发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。****

缺点: 占用资源比较大,如果保存的状态信息过多,将占用较多的内存资源;

场景: 需要保存与恢复数据的场景,比如游戏的存档功能;需要提供一种回滚操作的,如我们经常使用的Ctrl+Z撤销;

二、 观察者模式

定义: 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

理解: 观察者模式类似于一种广播机制,当被观察者的状态发生改变时,会通知观察者,从而根据被观察者状态做出响应。同时观察者模式也是一种任务分发机制,观察者就是任务的执行者。观察者模式的关键在于被观察者内部维护着一个观察者列表,被观察者内有一个方法,当该方法被调用时,就会调用观察者对应的方法。从表面上看,就像是这些方法被自动调用了一般。本质上则是被观察者方法的调用。观察者模式包含4个角色,抽象主题角色提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法;具体主题角色实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象;抽象观察者角色是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用;具体观察者角色实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

优点: 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则;目标与观察者之间建立了一套触发机制。

缺点: 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用;当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

场景: 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。我们每天都要观察时间,到点下班,每个员工都是观察者,时间就是观察对象。