命令模式(Commond)

2023-12-30 07:32
文章标签 模式 命令 commond

本文主要是介绍命令模式(Commond),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、实验目的:

1) 掌握命令模式(Commond)的特点

2) 分析具体问题,使用命令模式进行设计。

二、实验环境:

Eclipse

 

三、实验内容:

开发人员为公司内部OA系统开发了一个桌面版应用程序,该应用程序为用户提供了一系列自定义功能键,用户可以通过这些功能键来实现一些快捷操作。为了让用户能够灵活地进行功能键的设置,开发人员提供了一个“功能键设置”窗口,该窗口界面所示:

通过如图所示界面,用户可以将功能键和相应功能绑定在一起,还可以根据需要来修改功能键的设置,而且系统在未来可能还会增加一些新的功能或功能键。

为了降低功能键与功能处理类之间的耦合度,让用户可以自定义每一个功能键的功能,软件公司开发人员使用命令模式来设计“自定义功能键”模块,其核心结构如图4所示:

 

JAVA语言实现  (C#控制台应用程序实现)。绘制该模式的UML图。

模式UML

 

【运行代码】

Client.java

class Client { 

    public static void main(String args[]) { 

        FBSettingWindow fbsw = new FBSettingWindow("功能键设置"); 

             

        FunctionButton fb1,fb2

        fb1 = new FunctionButton("功能键1"); 

        fb2 = new FunctionButton("功能键1"); 

         

        Command command1,command2

        //通过读取配置文件和反射生成具体命令对象 

        command1 = (Command)XMLUtil.getBean(0); 

        command2 = (Command)XMLUtil.getBean(1); 

         

        //将命令对象注入功能键 

        fb1.setCommand(command1); 

        fb2.setCommand(command2); 

         

        fbsw.addFunctionButton(fb1); 

        fbsw.addFunctionButton(fb2); 

        fbsw.display(); 

         

        //调用功能键的业务方法 

        fb1.onClick(); 

        fb2.onClick(); 

    } 

}  

 

FBSettingWindow.java

import java.util.*; 

 

//功能键设置窗口类 

class FBSettingWindow { 

  private String title; //窗口标题 

  //定义一个ArrayList来存储所有功能键 

  private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>(); 

   

  public FBSettingWindow(String title) { 

      this.title = title

  } 

   

  public void setTitle(String title) { 

      this.title = title

  } 

   

  public String getTitle() { 

      return this.title

  } 

   

  public void addFunctionButton(FunctionButton fb) { 

      functionButtons.add(fb); 

  } 

   

  public void removeFunctionButton(FunctionButton fb) { 

      functionButtons.remove(fb); 

  } 

   

  //显示窗口及功能键 

  public void display() { 

      System.out.println("显示窗口:" + this.title); 

      System.out.println("显示功能键:"); 

      for (Object obj : functionButtons) { 

          System.out.println(((FunctionButton)obj).getName()); 

      } 

      System.out.println("------------------------------"); 

  }    

}

 

FunctionButton.java

//功能键类:请求发送者 

class FunctionButton { 

  private String name; //功能键名称 

  private Command command; //维持一个抽象命令对象的引用 

   

  public FunctionButton(String name) { 

      this.name = name

  } 

   

  public String getName() { 

      return this.name

  } 

   

  //为功能键注入命令 

  public void setCommand(Command command) { 

      this.command = command

  } 

   

  //发送请求的方法 

  public void onClick() { 

      System.out.print("点击功能键:"); 

      command.execute(); 

  } 

 

//抽象命令类 

abstract class Command { 

  public abstract void execute(); 

 

//帮助命令类:具体命令类 

class HelpCommand extends Command { 

  private HelpHandler hhObj; //维持对请求接收者的引用 

   

  public HelpCommand() { 

      hhObj = new HelpHandler(); 

  } 

   

  //命令执行方法,将调用请求接收者的业务方法 

  public void execute() { 

      hhObj.display(); 

  } 

 

//最小化命令类:具体命令类 

class MinimizeCommand extends Command { 

  private WindowHanlder whObj; //维持对请求接收者的引用 

   

  public MinimizeCommand() { 

      whObj = new WindowHanlder(); 

  } 

   

//命令执行方法,将调用请求接收者的业务方法 

  public void execute() { 

      whObj.minimize(); 

  } 

//窗口处理类:请求接收者 

class WindowHanlder { 

  public void minimize() { 

      System.out.println("将窗口最小化至托盘!"); 

  } 

 

//帮助文档处理类:请求接收者 

class HelpHandler { 

  public void display() { 

      System.out.println("显示帮助文档!"); 

  } 

 

XMLUtil.java

import javax.xml.parsers.*; 

import org.w3c.dom.*; 

import org.xml.sax.SAXException; 

import java.io.*; 

 

public class XMLUtil { 

//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象,可以通过参数的不同返回不同类名节点所对应的实例 

    public static Object getBean(int i) { 

        try { 

            //创建文档对象 

            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); 

            DocumentBuilder builder = dFactory.newDocumentBuilder(); 

            Document doc;                            

            doc = builder.parse(new File("config.xml"));  

         

            //获取包含类名的文本节点 

            NodeList nl = doc.getElementsByTagName("className"); 

            Node classNode = null; 

            if (0 == i) { 

                classNode = nl.item(0).getFirstChild(); 

            } 

            else { 

                classNode = nl.item(1).getFirstChild(); 

            }  

 

            String cName = classNode.getNodeValue(); 

             

            //通过类名生成实例对象并将其返回 

            Class c = Class.forName(cName); 

            Object obj = c.newInstance(); 

            return obj; 

        }    

        catch(Exception e){ 

            e.printStackTrace(); 

            return null; 

        } 

    } 

}

 

Config.java

<?xml version="1.0"?> 

<config> 

    <className>HelpCommand</className> 

    <className>MinimizeCommand</className> 

</config>  

 

【运行截图】

 

四、心得体会:

通过本次实验,学会了使用命令模式。命令模式的适用性如下:

1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

2.系统需要在不同的时间指定请求、将请求排队和执行请求。

3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

4.系统需要将一组操作组合在一起,即支持宏命令。

 

 

 

这篇关于命令模式(Commond)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/552129

相关文章

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Linux grep 命令的使用指南

《Linuxgrep命令的使用指南》本文给大家介绍Linuxgrep命令的使用指南,包括基础搜索语法、实践指南,感兴趣的朋友跟随小编一起看看吧... 目录linux grep 命令全面使用指南一、基础搜索语法1. 基本文本搜索2. 多文件搜索二、常用选项详解1. 输出控制选项2. 上下文控制选项三、正则表达

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编