广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java设计模式之命令模式
  • 186
分享到

Java设计模式之命令模式

2024-04-02 19:04:59 186人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

本文通过解决老王经常搞错借书人的问题,来引出行为型模式中的命令模式。为了在案例之上理解的更加透彻,我们需要了解命令模式在源码中的应用。最后指出命令模式的应用场景和优缺点。 读者可以拉

本文通过解决老王经常搞错借书人的问题,来引出行为型模式中的命令模式。为了在案例之上理解的更加透彻,我们需要了解命令模式在源码中的应用。最后指出命令模式的应用场景和优缺点。

读者可以拉取完整代码到本地进行学习,实现代码均测试通过后上传到码云,本地源码下载。

一、引出问题

老王的书房藏书越来越多,每天来借书的人络绎不绝。每天有人借书、还书、老王将A借的书算到B头上的乌龙事件频出。老王和小王就商量着手解决这个问题。

小王提议,在老王和借书者之间再增加一个“记录员”角色,记录员只管报名字就行了,具体是借什么书由借书者自己决定就好了。

老王说:这能解决部分问题。但在真实的场景下,不可能来一个借书者“记录员”就跑一趟。而且借书者有时候会借一半临时有事就不借了。这些问题你也要考虑进去。

老王接着说:你应该,在“记录员”角色中,增加一个队列,将所有借书者都放到一个队列中,既有往队列中放命令的方法,也有从命令中移除的方法,方便“记录员”请求排队和“撤销”。

二、命令模式的概念和应用

老王提出来的正是命令模式的“白话文解释”。我们来看命令模式的官方概念:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开,解耦合。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。

在命令模式中有三个角色:

抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。

实现者/接收者(Receiver)(老王)角色: 接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

具体命令(Concrete Command)(记录员)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

我们基于概念和角色划分,实现代码:

抽象命令类:


public interface AbstractCommand {

    //只需要定义一个统一的执行方法
    void execute();
}

具体命令角色(老王):


public class ConcreteCommand implements AbstractCommand {

    //持有接受者对象
    private String clent;

    public ConcreteCommand(String clent){
        this.clent = clent;
    }

    @Override
    public void execute() {
        System.out.println("具体执行者角色(老王):"+clent+"借书...");

    }
}

接收者(记录员):


public class ReceiverCommand {

    //可以持有很多的命令对象
    private ArrayList<AbstractCommand> commands;

    public ReceiverCommand() {
        commands = new ArrayList();
    }

    public void setCommand(AbstractCommand cmd){
        commands.add(cmd);
    }

    public void removeCommand(AbstractCommand cmd){
        commands.remove(cmd);
    }

    // 发出命令
    public void borrowBookMeaaage() {
        System.out.println("接受者角色(记录员):有人来借书啦...");
        //通知全部命令
        for (int i = 0; i < commands.size(); i++) {
            AbstractCommand cmd = commands.get(i);
            if (cmd != null) {
                cmd.execute();
            }
        }
    }
}

客户端(借书者):


public class Client {

    public static void main(String[] args) {

        //创建接收者
        //将订单和接收者封装成命令对象
        ConcreteCommand cmd1 = new ConcreteCommand( "A");
        ConcreteCommand cmd2 = new ConcreteCommand( "B");

        //创建具体命令者
        ReceiverCommand invoker = new ReceiverCommand();
        invoker.setCommand(cmd1);
        invoker.setCommand(cmd2);

        //喊一声有人要借书
        invoker.borrowBookMeaaage();


    }

}

基于命令模式实现的代码就实现了,但是看懂代码是一回事,自己能写出来就是另外一回事了。读者最好根据案例重新仿写一遍。

三、源码中的应用

在源码中使用命令模式的典型案例就是jdk多线程章节中的Runnable ,Runnable 相当于命令模式中的抽象命令角色。Runnable 中的 run() 方法就当于 execute() 方法。

我们知道,Java中一个类实现Runnable 接口,那么该类就认为是一个线程,就相当于命令模式中的具体命令角色。

当我们调用start()方法后,就可以与别的线程强占CPU的资源,在占用CPU的线程中就会执行run()方法。CPU的调度者就相当于具体命令角色也即记录员。Runnable 就完美的实现了用户自定义线程和CPU的解耦合。

命令模式在Runnable 中的应用应该很好理解。

四、总结

优点很明显,解耦了命令请求与实现,很容易的可以增加新命令,支持命令队列。

但是,这样会不可避免的使具体命令类过多,增加了理解上的困难。

设计模式学到这种程度,我们就会发现设计模式不是一种单一的技术,而是各种技术的综合体。

我们在学习设计模式的时候一定不要仅局限于一种模式,而是站在一定的高度去整体衡量哪种设计模式才是最优的。

有时候我们会发现,使用设计模式会让我们的代码变得更加的复杂,但以自己目前的开发经验又不能确定是否采用设计模式是一个好的选择。

归根结低,还是我们对设计模式掌握的不够熟练,这就需要我们继续深入学习设计模式,当我的学完再回头看这些问题,就很自然的迎刃而解了。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对编程网的支持。如果你想了解更多相关内容请查看下面相关链接

--结束END--

本文标题: Java设计模式之命令模式

本文链接: https://www.lsjlt.com/news/168830.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java设计模式之命令模式
    本文通过解决老王经常搞错借书人的问题,来引出行为型模式中的命令模式。为了在案例之上理解的更加透彻,我们需要了解命令模式在源码中的应用。最后指出命令模式的应用场景和优缺点。 读者可以拉...
    99+
    2022-11-13
  • Java设计模式之命令模式详解
    命令模式 定义:将请求封装成对象,这可以让你使用不同的请求、队列、或者日志来参数化其他对象。 何时使用命令模式?当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。 在被...
    99+
    2022-11-12
  • Java设计模式之java命令模式详解
    目录命令模式的介绍角色订单案例命令模式的优点适用场景示例代码应用宏命令----执行一组命令示例代码总结JDK源码解析 Runable是一个典型命令模式,Runnable担当命令的角色...
    99+
    2022-11-12
  • JavaScript设计模式之命令模式
    命令模式是JavaScript设计模式中行为型的一种设计模式; 定义:向某些对象发送请求,但是并不知道被请求的操作具体是什么,所以我们希望以一种松耦合的方式来设计程序,使得请求发送者...
    99+
    2022-11-12
  • Java以命令模式设计模式
    目录Java以命令模式设计模式1、简单介绍2、命令模式Java以命令模式设计模式 1、简单介绍 意图: 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解...
    99+
    2022-11-12
  • 深入理解Java设计模式之命令模式
    目录一、什么是命令模式二、命令模式的使用场景三、命令模式的优缺点四、命令模式的实现五、总结一、什么是命令模式 命令模式是一个高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你...
    99+
    2022-11-12
  • 每天一个设计模式之命令模式
    作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 原文地址是:《每天一个设计模式之命令模式》 欢迎...
    99+
    2023-01-31
    模式 命令
  • JavaScript设计模式之命令模式和状态模式详解
    目录命令模式命令模式介绍代码实现状态模式状态模式介绍代码实现小结命令模式 命令模式介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户...
    99+
    2022-11-13
  • .Net行为型设计模式之命令模式(Command)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、命令模式的代码实现六、命令模式的实现要点:1、命令模式的优点:2、命令模式的...
    99+
    2022-11-13
  • C语言设计模式之命令模式介绍
    目录介绍:传统方式:命令模式:总结介绍: ​ 命令模式是一种行为模式,它可以使代码解耦,便于维护; 假设我们现在要设计一个命令解析的模块: 传统方式: void func1(void...
    99+
    2022-11-12
  • Java 设计模式中的命令模式详情
    目录模式介绍UML类图命令模式案例命令模式的注意事项和细节模式介绍 命令模式(Command Pattern) :在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收...
    99+
    2022-11-13
  • Python 设计模式中命令模式
    目录1.命令模式2.应用场景3.代码示例1.命令模式 命令模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者)。 命令模式的思路是在调用者和接收者之间插入一个命令类(C...
    99+
    2022-11-13
  • JS设计模式之命令模式的示例分析
    这篇文章给大家分享的是有关JS设计模式之命令模式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。客户创建命令;调用者执行该命令;接收者在命令执行时执行相应操作简单命令对象...
    99+
    2022-10-19
  • JavaScript设计模式之命令模式的示例分析
    小编给大家分享一下JavaScript设计模式之命令模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!javascript是一种什么语言javascri...
    99+
    2023-06-14
  • 如何理解Java设计模式的命令模式
    本篇内容主要讲解“如何理解Java设计模式的命令模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的命令模式”吧!一、什么是命令模式命令模式是一个高内聚的模式,其定义为:...
    99+
    2023-06-25
  • PHP设计模式中的命令模式
    目录命令模式(Command Pattern)是什么命令模式的优点命令模式的实现命令模式的使用总结命令模式(Command Pattern)是什么 命令模式是一种行为型模式,它将请求...
    99+
    2023-05-14
    PHP设计模式命令模式 PHP命令模式
  • Java设计模式中的命令模式怎么实现
    本文小编为大家详细介绍“Java设计模式中的命令模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式中的命令模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。个人理解:把一个类里的...
    99+
    2023-06-30
  • Java设计模式之单例模式
    目录什么是设计模式?单例模式是什么?单例模式设计的原则是什么?Java实现单例模式的5种方式?懒汉饿汉静态内部类双重校验锁DCL(Double Check Lock)枚举(num)总...
    99+
    2022-11-12
  • Java设计模式之桥接模式
    本文通过老王和小王买车,引出设计模式中的结构型设计之桥接模式,接着说明设计型模式的概念和代码实现,为了加深理解,会说明适配器设计模式在JDBC中的应用,最后谈谈桥接模式和适配器模式的...
    99+
    2022-11-13
  • Java设计模式之享元模式
    本文通过优化买票的重复流程来说明享元模式,为了加深对该模式的理解,会以String和基本数据类型的包装类对该模式的设计进一步说明。 读者可以拉取完整代码到本地进行学习,实现代码均测试...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作