美文网首页
命令模式和策略模式

命令模式和策略模式

作者: 奔跑地蜗牛 | 来源:发表于2019-03-02 16:31 被阅读0次

    定义

    命令模式是指:通过把一个请求封装成一个对象,从而可以使用不同的请求例如命令等将客户端参数化;可以将请求排队或者记录请求日志,可以支持请求撤销操作;命令模式是一个对象行为模式,别名为动作模式或者事务模式;
    命令模式在将一个请求封装成一个对象后,无需了解请求激活的动作或者接收该请求后处理的细则;
    这是一种两台机器之间通信性质的模式,命令模式解耦了发送者和接受者之间的联系,发送者调用一个操作,接收者执行该操作,发送者无需知道接收者对于该操作的任何接口。

    结构图

    单请求单接收

    命令模式1.png

    接口说明:

    • Invoker:命令调用者,它通过命令来发送请求;
    • Command:抽象命令对象,它通常是一个接口或者一个抽象类,其中声明了一个execute()方法来调用命令接受者;
    • ConcreteCommand:命令对象,抽象命令的实现者,其内通过会依赖一个命令接收者,该命令接收者执行具体的动作;
    • Receiver: 命令接受者,它通常是命令具体执行者,其内会有一个action()方法,该方法是对请求的业务处理;

    单请求多接收

    命令模式-单请求多接收.png

    其中将多个命令封装到一个List中,从而实现一个请求将有多个接受者进行处理;

    请求支持撤销动作

    请求支持撤销动作.png

    -其中在Command方法中加入撤销动作undo(),即可实现该命令的撤销;

    场景

    命令模式非常类似“请求-响应”模式,因此它比较适用于日志记录,撤销操作,请求队列等场景,如以下等场景:

    • 适用命令模式作为"回调(CallBack)"在面向对象系统中的替代。"CallBack"讲得便是先将一个函数登记上,然后在以后调用此函数。
    • 需要在不同的事件指定请求,将请求排队。一个命令对象和命令发出者可以有不同的生命周期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令对象可能仍在本地,也可以在网络的另外一个地址。命令对象可以在序列化之后传送到另外一台机器上。
    • 系统需要支持命令的撤销,重新执行。命令对象可以把状态存储起来,等到客户端需要撤销命令时,执行undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时再重新实施命令效果。
    • 如果要将系统中所有数据更新到日志里,以便在系统崩溃时,可以根据日志读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。

    策略模式

    定义

    策略模式定义了一系列的算法,并且将每个算法封装成一个对象,同时这些算法还可以相互替代

    结构图

    策略模式.png

    说明:

    • Context:需要使用ConcreteStrategy提供的算法,并且其内部维护了一个Strategy的实例,同时负责动态设置运行时Strategy具体算法,还要负责Strategy之间的交互和数据传递;

    • Strategy:定义了一个公共接口,各种算法实现该接口,Context使用该接口来实现不同的算法,一般为一个抽象类或者公共接口;

    • ConcreteStrategy:算法具体实现类;

    策略模式和命令模式区别

    • 目标不同: 策略模式主要针对同一动作,才用不同的实现方式,而命令模式是针对不同的命令,有不同的接收者来实现;
    • 主体不同:策略模式的主体是具体的应用对象,例如排序器,可以根据不同的场景才用不同的排序方式;而命令模式的主体是请求发送者和请求接受者,例如遥控器和空调,遥控器会有空凋相应的指令,来命令空调执行相应的方法;

    相关文章

      网友评论

          本文标题:命令模式和策略模式

          本文链接:https://www.haomeiwen.com/subject/jgzjuqtx.html