`
endlesshb
  • 浏览: 1057 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[原创]设计模式之命令模式详解

阅读更多
设计模式现如今已经被程序员越来越重视一个好的软件设计和设计模式息息相关,一个理想的模式的应用会使程序在可阅

读性上和扩展性上将大大提升,可以为后期的维护和扩展带来很大的便利,小弟在这里简单介绍设计模式只是想通过自己

所浅显的理解用自己的简单的语言表达出来让更多的初学者理解和使用上设计模式!


命令模式之命令模式,故名思意 命令模式 命令就是这个模式的关键之处,先来了解下现实中的命令 现实中命令也无处不

在.命令模式是关于处理一个对象请求另一个对象调用其方法去完成某一项任务!

举例说明:

士兵军训,教官对士兵下命令 跑步走,起步走,向左转 这就是一个命令,这其中士兵 就是命令的接受者,而跑步走 齐步

走 是一个明确的命令,教官此时是请求者 此处我们叫命令发起者! 这段语言描述其实就已经描述了一个明确的命令模

式!
               命令请求者        命令执行者       具体命令
                                   
                  教官----------->士兵-------->向左转

在这里教官面对士兵时不需要和一个一个的士兵去打交道 让他们向左转,他只需要下命令向左转,士兵就会执行命令去向

左转!命令模式的核心就是使用命令对象来封装方法调用,就是在这里将教官的命令和士兵执行命令封装成一个命令对象

这样当教官下了某种命令的时候 教官只需要和命令打交道 教官只需要喊出 跑步走 士兵就会集体跑步走!

下面给出刚才所说的案例的具体Java代码的实现:

/**
*  接受者实现方法
*  士兵的动作实现类,跑步走,齐步走,向左转
*/
public class SoldierAction{
    
    //士兵跑步走的具体实现
    public void SoldierRun(){
        
          System.out.println("士兵跑步走");
    }
    
    //士兵齐步走的具体实现
    public void SoldierQuickStep(){
        
           System.out.println("士兵齐步走");

    }

    //士兵向左转的实现
     public void SoldierTurnLeft(){

           System.out.println("士兵向左转");

    }
} 


/**
*  这时候我们来创建教官命令接口
* 
*/
public interface MasterCommand{
     
     //一个执行命令的方法
     public void executeCommand();
}


/**
*  这时候我们来创建教官命令接口的实现类
*  士兵跑步走命令的实现
*/
public class SoldierRunCommand implements MasterCommand{
     
    private SoldierAction soldierCommand;
    
    public SoldierRunCommand(SoldierAction inputSoldierAction){
        
         this.soldierCommand=inputSoldierAction;
    }
     //一个执行命令的方法
     public void executeCommand(){
         
          soldierCommand.SoldierRun();
    }
}


/**
*  这时候我们来创建教官命令接口的实现类
*  士兵齐步走命令的实现
*/
public class SoldierQuickStepCommand implements MasterCommand{
     
    private SoldierAction soldierCommand;
    
    public SoldierRunCommand(SoldierAction inputSoldierAction){
        
         this.soldierCommand=inputSoldierAction;
    }
     //一个执行命令的方法
     public void executeCommand(){
         
          soldierCommand.SoldierQuickStep();
    }
}



/**
*  这时候我们来创建教官命令接口的实现类
*  士兵向左转命令的实现
*/
public class SoldierTrunLeftCommand implements MasterCommand{
     
    private SoldierAction soldierCommand;
    
    public SoldierRunCommand(SoldierAction inputSoldierAction){
        
         this.soldierCommand=inputSoldierAction;
    }
     //一个执行命令的方法
     public void executeCommand(){
         
          soldierCommand.SoldierTurnLeft();
    }
}


/**
*  这时候我们来创建教官请求的实现类
*  教官在这里发出命令
*/
public class MasterPublishCommand{
     
    private MasterCommand masterCommand;
    
    public void setMasterCommand(MasterCommand inputCommand){
        
         this.mMasterCommand=inputCommand;
    }
     //一个执行命令的方法
     public void publishCommand(){
         
          masterCommand.executeCommand();
    }
}


好了,此时我们的请求者已经创建完成,我们的具体命令 和 接受者都已经完成创建 此时我们就要进行训练了

 public class TrainTroops{

     public static void main(Stirng[]args){
         
         //首先我们来创建命令接受者
         SoldierAction sa=new SoldierAction();

         //创建一条跑步的命令
          MasterCommand runCommand=new SoldierRunCommand();
         
         //创建一条齐步走的命令
          MasterCommand stepCommand=new SoldierQuickStepCommand();
        
         //创建一个向左转的命令
          MasterCommand turnLeftCommand=new SoldierTurnLeftCommand();

         //然后我们来创建一个教官
          MasterPublishCommand master=new MasterPublishCommand();

        //此时教官发布一条跑步的命令
         master.setMasterCommand(runCommand);

        master.publishCommand();

        //此时教官发布一条齐步走的命令
         master.setMasterCommand(stepCommand);

        master.publishCommand();

        //此时教官发布一条向左转的命令
         master.setMasterCommand(turnLeftCommand);

        master.publishCommand();
     }
 }


整个代码我们就完成了一个命令模式的实现,当然了例子很简单,此处我们的代码中教官这个命令发布者的角色不需要和

任何的接受者去打交道,他只需要知道自己要下什么命令就是此处的master.setMasterCommand(stepCommand)

然后把命令发布出去就可以了master.publishCommand(),教官这个命令请求的角色中不包含任何接受者的示例引用

因此彻底的消除了命令发布者 和 接受者之间的耦合!如果此时需要增加新的命令或者是新的命令接受者的话,不需要修

改调用类的代码,调用者就可以使用新的命令对象,反过来如果增加了新的调用者,不需要修改现有的命令和命令接受者

新增加的调用者就可以直接使用已有的具体命令了!

本人不敢说理解的很透彻了,只是想通过自己的理解用最简单的话语表现出来对设计模式的理解,目的是希望能用比较好

理解的一种方式让大家去理解和学习设计模式,希望广大大牛新手来拍砖,如有错误和其他独特见解的可以指出大家互相

交流进步,如果效果好的话会考虑为广大网友连载,本人属于自己原创,完全是自己的见解,转载请标明出处!谢谢


分享到:
评论

相关推荐

    windows驱动开发技术详解-part2

    原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快 速学习编译、安装、调试的方法。  从Windows最基本的两类驱动程序的编译、安装、调试入手讲解,非常容易上手,用...

    Windows驱动开发技术详解的光盘-part1

    原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快速学习编译、安装、调试的方法。  从Windows最基本的两类驱动程序的编译、安装、调试入手讲解,非常容易上手,用实例...

    原创:应用串行NOR闪存提升内存处理能力

    【NOR闪存详解】 NOR闪存是一种非易失性内存技术,广泛应用于嵌入式系统中,尤其是对于低密度需求的场景。NOR闪存的优势在于其低延时特性,这使得它能直接执行存储在其上的代码,无需经过额外的内存层次,因此在...

    26-原创 VB上位机控制LED灯程序

    在“26-原创 VB上位机控制LED灯程序”中,开发者可能使用了按钮、计时器等控件,用户可以通过点击按钮来改变LED灯的状态,或者设定定时任务让LED灯按照特定模式闪烁。 要实现VB上位机与LED灯的通信,通常需要以下...

    原创看图快速学PADS Router高级应用之一(宏的使用)

    ### PADS Router宏功能详解——以一键添加VIA过孔为例 #### 一、引言 随着电子行业的快速发展,PCB设计工具也在不断进化以适应更高效的设计需求。PADS作为一款广泛使用的...希望本文能为您的设计之路提供有力的帮助。

    【原创】讯联电子DA14580实战教程---DA14580 SDK介绍

    ### DA14580 SDK知识点详解 #### 一、SDK概述 讯联电子推出的DA14580 SDK(Software Development Kit)是一款专为DA14580蓝牙芯片设计的开发工具包。该SDK旨在帮助开发者快速掌握并利用DA14580芯片的强大功能,...

    java2018面试宝典

    常见的设计模式如单例、工厂、策略模式等,都需要有深入的理解和应用能力。 - 需要掌握面向对象的三大特性:封装、继承、多态。 **数据库**: - 数据库部分涉及数据库系统原理、SQL语言和数据库的性能优化。 - ...

    原创免费运动检测及测速GUI-src.zip

    原创免费运动检测及测速GUI-src.zip 运动检测及测速GUIdemo详解涉及内容: 1.GUI主--子界面设计:主界面GUI启动子界面GUI 更改程序图标icon 2.GUI转化为可执行程度:用matlab自带编译工具deploytool对程序进行...

    原创免费运动检测及测速GUI-distrib.zip

    原创免费运动检测及测速GUI-distrib.zip 运动检测及测速GUIdemo详解涉及内容: 1.GUI主--子界面设计:主界面GUI启动子界面GUI 更改程序图标icon 2.GUI转化为可执行程度:用matlab自带编译工具deploytool对程序...

    原创免费运动检测及测速GUI-GUI生成.zip

    原创免费运动检测及测速GUI-GUI生成.zip 运动检测及测速GUIdemo详解涉及内容: 1.GUI主--子界面设计:主界面GUI启动子界面GUI 更改程序图标icon 2.GUI转化为可执行程度:用matlab自带编译工具deploytool对程序...

    数据库作业要求

    逻辑结构设计是将概念模型转化为具体的数据库模式,通常涉及关系模式的定义或通过PowerDesigner创建物理数据模型图。 **创建数据库**: 在这一阶段,学生需要编写SQL语句来创建数据库中的表。SQL(结构化查询语言)...

    某个HEV插件

    【HEV插件详解】 在电子游戏领域,尤其是第一人称射击游戏Counter-Strike 1.6(简称CS1.6)中,玩家经常会遇到各种各样的插件以提升游戏体验。"某个HEV插件"是专为CS1.6设计的一个插件,它增加了游戏内的特殊功能或...

    ThinkPHP3.2.3完全开发手册

    - **面向对象与MVC结构**:采用面向对象编程思想,支持MVC(Model-View-Controller)设计模式,有助于开发者更好地组织代码结构。 - **高性能与简洁性**:通过优化框架设计达到高性能的目标,同时确保代码简洁,...

    GNU编码标准.doc

    ### GNU编码标准详解 #### 引用私有程序 在GNU编码标准中,明确禁止在任何情况下引用或模仿私有程序的源代码,包括Unix或其他专有软件的代码。这一规定旨在鼓励创新和原创性,避免潜在的法律纠纷。开发者被鼓励...

    syn6288串口语音芯片

    **syn6288串口语音芯片详解** syn6288是一款专为电子设备设计的串口控制语音芯片,其主要特点在于可以通过串行接口(Serial Port)发送指令来播放预录的语音,极大地简化了语音应用的开发流程,提高了调试效率。这...

    Photoshop 入门教学大纲.pdf

    用户可以借助它创作出富有原创性的作品。该软件界面友好、功能全面且易于操作,兼具创造性和趣味性。 - **课程定位**:本课程采用Adobe公司的最新版本Photoshop CC,通过一系列典型的实例教学,旨在让学生从基础知识...

    [原创]unix2dos工具

    【Unix2Dos工具详解】 Unix2Dos是一款在MS-WINDOWS和DOS环境下使用的文本转换工具,它提供了双向转换功能,即可以从DOS格式转换为UNIX格式,也可以从UNIX格式转换为DOS格式。这个工具对于经常需要在两种操作系统...

    rar帮助文本

    ### RAR帮助文本详解 #### 引言 RAR是一款功能强大的压缩工具,专门设计用于管理和操作RAR格式的压缩文件,其32位控制台版本专为命令行操作者设计。RAR不仅提供高效的压缩算法,还支持多种高级功能,如文件恢复、...

Global site tag (gtag.js) - Google Analytics