设计模式(一):命令模式(4)——命令模式扩展之日志请求

前言

命令模式的讲解分为四篇:

设计模式(一):命令模式(1)——基本的命令模式

设计模式(一):命令模式(2)——命令模式扩展之宏命令

设计模式(一):命令模式(3)——命令模式扩展之队列请求

设计模式(一):命令模式(4)——命令模式扩展之日志请求

一、命令模式扩展之日志请求

1.日志请求的工作方式

上一节介绍了命令模式之队列请求,本节介绍一下另一个扩展——日志请求。某些用用需要将我们所有的动作都记录在日志中,并能在系统死机之后,重新调用这些动作恢复到之前的状态。命令模式能够支持这一点。这些技巧可以被应用到事务控制等操作的处理中。下面我们来模拟这样一个场景来实现日志请求的工作方式。我们会模拟电脑执行了几个动作命令并将日志存储在电脑中,然后模拟电脑在此刻死机,我们的数据此刻全部丢失。在电脑重启后,我们再通过加载存储的命令恢复数据。

2.代码实现

代码地址:https://github.com/wutianqi/desin-patterns/tree/master/design-pattern/src/main/java/com/wutqi/p1/command_pattern/p4/log

******************Computer*************************

/**
 * 电脑,命令调用者
 * @author wuqi
 * @Date 2019/1/30 15:46
 */
public class Computer {
    //执行的命令日志
    private List<Command> commandLogs;
    private Command command;

    public Computer(List<Command> commandLogs){
        this.commandLogs = commandLogs;
    }

    public void execute(){
        this.command.execute();
        commandLogs.add(command);
    }

    public void setCommand(Command command){
        this.command = command;
    }

    /**
     * 存储
     */
    public void store(){
        //存储命令日志,实际中是将其存储在文件中
        System.out.println("commandLogs is been stored");
    }

    /**
     * 加载
     */
    public void load(){
        //实际上是从文件中取出commandLogs然后执行之前执行过的命令对象
        for(Command c : commandLogs){
            c.execute();
        }
    }

}

******************ActionCommand*************************

/**
 * 动作命令
 * @author wuqi
 * @Date 2019/1/30 14:33
 */
public class ActionCommand implements Command {
    /**
     * 动作名称
     */
    private String name;

    public ActionCommand(String name){
        this.name = name;
    }

    @Override
    public void execute() {
        System.out.println("action " + name + " is been execute...");
    }

    @Override
    public void undo() {

    }
}

******************ActionCommandTest*************************

/**
 * @author wuqi
 * @Date 2019/1/30 14:37
 */
public class ActionCommandTest {
    public static void main(String[] args) {
        //创建存储执行命令的地方
        List<Command> commandLogs = new ArrayList<>();
        //创建命令的发出者,电脑
        Computer computer = new Computer(commandLogs);
        for(int i=0;i<5;i++){
            ActionCommand actionCommand = new ActionCommand("" + i);
            computer.setCommand(actionCommand);
            computer.execute();
        }
        //存储命令
        computer.store();
        try{
            //模拟电脑死机
            int a = 1/0;
        }catch (Exception e){
            System.out.println("the computer is bung!");
            //电脑重启,加载存储命令的文件并进行恢复,这里是从storedCommands中取储命令进行恢复。正常情况下应该先从文件中取出storeCommands,再执行
            System.out.println("the computer is restart,begin load action");
            computer.load();
        }

    }
}

执行结果:

二、总结

由命令模式实现日志请求的好处在于,如果我们操作的是大型的数据存储,我们不可能在每一次请求执行后立即将数据快速的保存下来,此时记录日志请求就先的十分重要了。

原文地址:https://www.cnblogs.com/wutianqi/p/10338511.html

时间: 2024-08-07 08:17:09

设计模式(一):命令模式(4)——命令模式扩展之日志请求的相关文章

设计模式(一):命令模式(2)——命令模式扩展之宏命令

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.升级遥控器 1.需求 经过上一节的设计,我们的遥控器每个按键都具备了基本的开关功能,还有一个按键具备了撤销功能.但人类都是懒惰的,现在我们想要按下0号插槽的On按钮时就可以将电灯.空调.洗衣机打开,按下0号插槽的Off按钮时就可以将电灯.空调

设计模式(一):命令模式(3)——命令模式扩展之队列请求

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.命令模式扩展——队列请求 1.队列请求的工作方式 上一篇说了命令模式的扩展之宏命令,本节讲解一下命令模式的第二个扩展队列请求.因为命令可以将运算块打包(一个接收者和一组动作),然后将它传来传去,就像是一般的对象一样.现在,即使命令被创建许久之

设计模式(一):命令模式(1)——基本的命令模式

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.生活中的命令模式 1.案例 如果将命令模式反映到生活中,遥控器无疑是一个很好的例子.假如我们有如下一个遥控器 这个遥控器有三个插槽(编号为0,1,2),每个插槽对应着要操作的一个电器,插槽所控制的电器这里设置的分别是卧室灯.空调.冰箱,这些电

IOS设计模式之四(备忘录模式,命令模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 备忘录(Memento)模式 备忘录模式快照对象的内部状态并将其保存到外部.换句话说,它将状态保存到某处,过会你可以不破坏封装的情况下恢复对象的状态,也就是说原来对象中的私有数据仍然是私有的. 如何使用备忘录模式 在ViewController.m中增加

设计模式(十四):Command命令模式 -- 行为型模式

1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧

Java进阶篇设计模式之八 ----- 责任链模式和命令模式

前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern). 责任链模式 简介 责任链模式顾名思义,就是为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接

Java设计模式之八 ----- 责任链模式和命令模式

前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern). 责任链模式 简介 责任链模式顾名思义,就是为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接

设计模式(五):命令模式

一.定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 我觉得可以这样:将一个请求封装为一个对象,对请求排队或记录请求日志,以及支持可撤销的操作:从而使你可用不同的请求对客户进行参数化: 二.实例:一个遥控面板,两台小家电.一个面板控制两台小家电 2.1  不用命令模式实现 命令发起者:一块遥控器 命令接收者:一堆小家电 小家电接口: public interface ISmallAppliance { int Appid {

跟我学设计模式视频教程——命令模式vs策略模式,唠嗑

课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--命令模式vs策略模式,唠嗑,布布扣,bubuko.com