zoukankan      html  css  js  c++  java
  • 设计模式-命令模式

    命令模式

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

    介绍

    意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

    主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

    何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

    如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

    关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

    应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。

    优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

    缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

    使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

    注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。

    核心代码

    Command接口:

    /**命令接口
     * Created by xueLai on 2019/1/30.
     */
    public interface Command {
        public void execute();
    }
    

    具体命令ConcreteCommand :

    /**
     * 具体命令,他绑定了一个命令接收类的操作对象
     * Created by xueLai on 2019/1/30.
     */
    public class ConcreteCommand implements Command {
        private Receiver receiver = null;
    
        public ConcreteCommand(Receiver receiver){
            this.receiver = receiver;
        }
        public void execute() {
            receiver.action();
        }
    }
    

    命令调用类Invoker :

    /**命令调用类,持有一个命令对象
     * Created by xueLai on 2019/1/30.
     */
    public class Invoker {
        private Command command = null;
    
        public void setCommand(Command command) {
            this.command = command;
        }
    
        public void action() {
            command.execute();
        }
    }
    

    命令执行类Receiver :

    /**命令接受者,他会去执行具体的业务逻辑
     * Created by xueLai on 2019/1/30.
     */
    public class Receiver {
        public void action(){
            //真正执行命令操作的功能代码
        }
    }
    
    

    客户Client:

    
    /**client:命令的来源
     * Created by xueLai on 2019/1/30.
     */
    public class Client {
        public static void main(String[] args) {
            //创建接收者
            Receiver receiver = new Receiver();
            //创建命令对象,设定它的接收者
            Command command = new ConcreteCommand(receiver);
            //创建Invoker,把命令对象设置进去
            Invoker invoker = new Invoker();
            invoker.setCommand(command);
            invoker.action();
        }
    }
    

    调用者Invoker 与接受者Receiver通过命令进行解耦.

    命令的流向为:

    1.Client发布具体命令
    2.Invoker.setCommond(ConcreteCommand.setReceiver(Receiver ))

    类图:

    在这里插入图片描述

  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/DiZhang/p/12544815.html
Copyright © 2011-2022 走看看