Java代码
- package memento.example;
-
- import java.util.Date;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.concurrent.ConcurrentHashMap;
-
- /**
- *
- *作者:alaric
- *时间:2013-8-25下午2:48:05
- *描述:备份服务器(管理者)
- */
- public class BackupsServer {
- private DatabaseServer dbServer ;//增强管理者的功能,把发起人的操作放在这里
- private Map<Long,IMemento> mementos ;//用一个map来对数据库服务多点备份
-
- public BackupsServer(DatabaseServer dbServer) {
- super();
- this.dbServer = dbServer;
- mementos = new ConcurrentHashMap<>();
- }
-
- /**
- *
- *作者:alaric
- *时间:2013-8-25下午3:47:18
- *描述:还原
- */
- public void retrieveMemento(){
- Iterator<Long> it = mementos.keySet().iterator();
- //还原到最近一个可用的状态
- while(it.hasNext()){
- Long key = it.next();
- IMemento val = mementos.get(key);
- boolean isUseable = dbServer.restoreMemento(val);
- if(isUseable){
- break;
- }
- }
- }
- /**
- *
- *作者:alaric
- *时间:2013-8-25下午4:05:01
- *描述:备份
- */
- public void createMemento(){
- IMemento memento = dbServer.createMemento();
- this.mementos.put(new Date().getTime(), memento);
- }
-
-
- }
Java代码
- package memento.example;
-
- import java.util.Map;
-
- import memento.Caretaker;
-
-
- /**
- *
- *作者:alaric
- *时间:2013-8-25下午2:03:49
- *描述:测试类
- */
- public class Client {
-
-
- private static DatabaseServer dbServer = new DatabaseServer();
- private static BackupsServer backupServer = new BackupsServer(dbServer);
-
- /**
- *作者:alaric
- *时间:2013-8-25下午2:03:43
- *描述:
- * @throws InterruptedException
- */
- public static void main(String[] args) throws InterruptedException {
- //数据库系统设置可用状态
- dbServer.setUseable(true);
- //备份
- backupServer.createMemento();
-
- //1秒钟备份一次
- Thread.sleep(1000);
- dbServer.setUseable(true);
- backupServer.createMemento();
-
- Thread.sleep(1000);
- dbServer.setUseable(true);
- backupServer.createMemento();
-
- Thread.sleep(1000);
- //设置系统故障
- dbServer.setUseable(false);
- //系统故障立即还原到最近一次可用状态
- System.out.println("------系统还原-----");
- backupServer.retrieveMemento();
- }
-
- }
运行结果:
DB state useable is: true
DB state useable is: true
DB state useable is: true
DB state useable is: false
------系统还原-----
DB state useable is: true
上述代码利用黑箱实现方式模拟了数据库备份还原过程。备忘录模式优点是简化了发起人(Originator)类,它不在需要管理负责备份一个副本在自己内部,当发起人内部状态失效时,可以用外部状态来还原。备忘录模式的缺点是完整保存发起人状态在整个过程中,备忘录角色的资源消耗可能很大,还有就是管理者不知道资源到底多大,外部能不能承担,外部无法预料,也无法给用户一个提醒。
|