设计模式之--命令模式

1.命令模式的定义

Encapsulate a request as an object,there by letting you parameterize clients with different requests,queue or log requests,and support undoable operations.

将请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可提供命令的撤销和恢复功能。

2.命令模式的通用类图

命令模式通用类图如下:

在类图中的三个角色描述如下:

Receiver:

命令接受者,执行命令的对象

Command:

具体命令的包装类,所有命令都在此类中声明

Invoker:

接收到命令,并且执行命令,充当管理者的角色

相关代码如下:

Receiver:

public abstract class Receiver {

    /**
     * 命令的具体执行者
     */
    public abstract void doSomething();
}

ConcreteReceiver:

public class ConcreteReceiver extends Receiver {

    @Override
    public void doSomething() {
        System.out.println("Do something.");
    }
}

Command:

public abstract class Command {

    /**
     * 执行命令
     */
    public abstract void executor();
}

ConcreteCommand:

public class ConcreteCommand extends Command {

    private Receiver receiver;

    ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void executor() {
        this.receiver.doSomething();
    }
}

Invoker:

public class Invoker {

    private Command command;

    public Invoker() {
    }

    public void action(){
        this.command.executor();
    }

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

Client:

public class Client {

    public static void main(String[] args) throws Exception {
        Invoker invoker = new Invoker();

        Receiver receiver = new ConcreteReceiver();
        Command command = new ConcreteCommand(receiver);

        invoker.setCommand(command);
        invoker.action();
    }
}

3.命令模式的优缺点

优点: 调用者和接受者之间的解藕 Command可以有多个子类,可扩展性比较高

缺点: 当命令比较多的时候,会出现Command有N个子类的情况

4.命令模式的使用场景

GUI事件监听、Spring的事件监听、Redis的pub/sub等

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏你不就像风一样

史上超详细的Spring-Boot-Cache使用与整合

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheMa...

6862
来自专栏开发技术

spring-boot-2.0.3不一样系列之源码篇 - run方法(二)之prepareEnvironment,绝对有值得你看的地方

  此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事。如果大家对springboot的源码有所研...

2653
来自专栏葡萄城控件技术团队

七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理

? 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验...

34810
来自专栏向治洪

JSBridge深度剖析

概述 做过混合开发的人都知道Ionic和PhoneGap之类的框架,这些框架在web基础上包装一层Native,然后通过Bridge技术的js调用本地的库。 在...

3445
来自专栏吴伟祥

Apache Velocity-----基于Java的模板引擎

Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开...

1.7K2
来自专栏阿杜的世界

Java Web技术经验总结(十七)

882
来自专栏Adam笔记

KSCrash源码分析

8470
来自专栏Web项目聚集地

「实用教程」登录失败超过一定次数如何锁定帐号?

本教程作者是「小灯光环」,作者简介:全栈开发工程师,CSDN博客专家,CSDN论坛 Java Web/Java EE版主,热爱技术,乐于分享,在分布式Web开发...

7902
来自专栏大内老A

如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server

我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(《聊聊ASP.NET Core默认提供的这个跨平台的服务...

2398
来自专栏大内老A

如何通过Remoting实现双向通信

Remoting是NET平台下比较成熟高效的分布式技术,我们习惯采用传统的远程调用的方式使用Remoting。在客户端所在的Application Domain...

2308

扫码关注云+社区

领取腾讯云代金券