命令模式案例实验报告
命令模式的应用实例

命令模式的应用实例
命令模式是一种常见的设计模式,它能够将一个命令封装成一个对象,使得命令的执行、撤销、重做等操作变得更加简单和灵活。
在实际应用中,命令模式有广泛的应用场景,下面将介绍几个典型的例子。
第一个例子是文本编辑器中的撤销操作。
我们在文本编辑器中常常会使用撤销操作,通过撤销操作可以将之前的操作全部撤销掉。
实际上,撤销操作就是命令模式的应用。
每个操作都可以被封装成一个命令对象,每个命令对象可以保存操作前的状态,执行撤销操作时,只需要按照命令对象的反向指令来执行即可。
第二个例子是遥控器控制器。
在大多数家庭中,我们都会有遥控器控制电视、音响等设备。
这些设备的遥控器都具备命令模式的特点,每个按钮都对应一个命令,按下按钮就执行相应的命令。
遥控器还可以实现撤销、重做等操作,只需要记录每个命令执行前的状态即可。
第三个例子是游戏中的角色操作。
在游戏中,我们可以通过键盘、鼠标等输入设备来控制角色的动作。
这些操作都可以通过命令模式来实现,每个动作都对应一个命令对象,当玩家按下相应的键时,就执行相应的命令,可以实现多个动作的组合,还可以撤销、重做等操作。
通过上述例子,我们可以看出命令模式在实际应用中的广泛性和灵活性。
命令模式能够将命令与具体操作的实现分离,使得系统更加灵活和易于扩展。
在开发过程中,我们可以根据具体需求来选择合适的命令对象来执行相应的操作,从而提高系统的效率和可维护性。
因此,在设计系统时,有必要充分考虑命令模式的应用,以实现更加高效、灵活和可维护的系统。
计算机网络(实验一_网络命令使用和网络服务配置)

《计算机网络》课程实验报告实验一:网络命令、工具使用和效劳器配置FTP主要命令的作用●写出几个你所熟悉的网络测试命令●简要说明效劳器远程登录的开启和登录账户的建立步骤1.开场→控制面板〔小图标〕→程序和功能→翻开或关闭Windows功能→选择Telnet效劳器、客户端所有选项→确定,稍微等几分钟。
2.管理工具→计算机管理→本地用户和组→用户→添加用户→组→RemoteDesktop user右键→添加到组,添加新建立的用户。
3.计算机右键→属性→远程设置→选择〞仅允许运行使用网络级别身份验证的远程桌面的计算机连接〞→确定。
4.开场→远程桌面连接→输入远程主机IP地址→连接→输入用户名、密码→确定。
实验过程中遇到的问题如何解决的?〔10分〕得分:问题1:无法成功远程桌面连接。
解决过程:检查自己的 telnet 配置,检查无误;检查目标计算机的配置,remote desktop service 效劳被禁用。
配置目标计算机:将目标计算机remote desktop service 效劳启动类型更改为手动,并启用该效劳。
问题2:无法启动ftp站点。
解决过程:错误提示“可能有其他进程占用了设置的端口〞,但使用netstat命令并没有发现这一现象,重新设置端口问题还是没有解决,最终使用netsh winsock reset重置了网络设置,重启后问题解决。
open 连接到制定 IP。
quit 退出 telnet。
容二:〔20分〕得分:说明利用Telnet进展应用层协议〔HTTP或SMTP或POP3〕实验过程。
1.翻开 DOS 命令界面2.输入 telnet .mircosoft. 803.ctrl+] 进入命令模式4.键入 set localecho 并回车5.键入 GET /HTTP/1.16.Host: .mircosoft. 并回车 2 次容三:〔20分〕得分:简要说明FTP Server的配置过程和FTP主要命令的作用,实验过程截图1.开场→控制面板〔小图标〕→程序和功能→翻开或关闭 Windows 功能→选择Internet信息效劳所有选项→确定,稍微等几分钟。
命令模式

{ //绑定一个具体命令 //绑定一个具体命令 command = cmd; } public override void Clicked() { //将请求发送给命令对象 //将请求发送给命令对象 command.Execute(); } private Command command; } static void Main(string[] args) { //创建命令的接收者对象 //创建命令的接收者对象 Software doc = new Software();
Receiver——命令接受者 Receiver——命令接受者 知道如何实施与执行一个请求相关的操作。 在结构图中, Command对象作为 Command对象作为 Invoker的一个属性,当点击事件发生时, Invoker的一个属性,当点击事件发生时, Invoker调用方法Invoker()将请求发送给 Invoker调用方法Invoker()将请求发送给 ConcreteCommand,再由 ConcreteCommand,再由 ConcreteCommand调用Execute()将请 ConcreteCommand调用Execute()将请 求发送给Receiver, Client负责创建所有的 求发送给Receiver, Client负责创建所有的 角色,并设定Command 角色,并设定Command 与Invoker 和 Receiver之间的绑定关系。 Receiver之间的绑定关系。
public void Run() { //执行Run命令 //执行 执行Run命令 Console.WriteLine("Copy finished!"); } } //抽象类MenuItem表示命令菜单,提供Clicked()接口 //抽象类 抽象类MenuItem表示命令菜单 提供Clicked()接口 表示命令菜单, public abstract class MenuItem { //定义Clicked接口 //定义 定义Clicked接口 public abstract void Clicked(); } //CommandItem类 它维护一个Command对象 //CommandItem类,它维护一个Command对象,在本例中属于 对象, Invoker的角色 Invoker的角色 public class CommandItem : MenuItem { public CommandItem(Command cmd)
命令解释程序的编写实验报告参考模板

实验一、命令解释程序的编写实验专业:软件工程姓名:麦婉仪学号:201106014149一、实验目的(1)掌握命令解释程序的原理;(2)掌握简单的DOS调用方法;(3)掌握C语言编程初步。
二、实验内容和要求编写类似于DOS,UNIX的命令行解释程序(1)自行定义系统提示符(2)自定义命令集(8-10个)(3)用户输入HELP以查找命令的帮助(4)列出命令的功能,区分内部还是外部命令(5)用户输入QUIT退出(6)内部命令有dir, cd, md, rd, cls, date, time, ren, copy等。
三、实验方法、步骤及结果测试1、本程序采用了c语言中的while语句和if …else if的嵌套的方法完成。
将所需的命令字符串存到定义的数组内,从键盘输入利用strcmp进行筛选,若输入正确的命令会显示此命令的解释。
输入“help”会提示,将命令提示全部显示出来,而输入“quit”就会退出程序。
2、主要程序段#include<stdio.h>#include <stdlib.h># include<string.h>main(){charcmd[30][30]={"dir","cd","md","rd","cls","date","time","ren", "copy","quit","help"};char str[10];int i;while(1){printf("请输入提示符:>");gets(str);for(i=0;i<20;i++){{if(strcmp(str,cmd[0])==0){printf("类型:内部命令\n");printf("查看当前的目录···\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[1])==0){printf("类型:内部命令\n");printf("显示当前目录的名称···\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[2])==0){printf("类型:内部命令\n");printf("创建一个新目录···\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[3])==0){printf("类型:内部命令\n");printf("删除该目录....\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[4])==0){printf("类型:内部命令\n");printf("清屏···\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[5])==0){printf("类型:内部命令\n");printf("显示或设置日期···\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[6])==0){printf("类型:内部命令\n");printf("显示或设置系统时间···\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[7])==0){printf("类型:内部命令\n");printf("重命名文件···\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[8])==0){printf("类型:内部命令\n");printf("将至少一个文件复制到另一个位置···\n");printf("\n");printf("\n");break;}else if(strcmp(str,cmd[9])==0){return 0;}这一段则是主要的程序内容,用while语句进行选择,然后用if…else if 进行嵌套。
软件设计模式(JAVA) 11_命令模式_实验指导书

实验(上机)十一命令模式实验(上机)目的1、练习使用行为型设计模式;2、练习使用命令模式的设计思路;3、练习使用命令模式实现“功能按钮与功能之间设置”案例的实现。
实验(上机)课时2学时实验(上机)环境JDK1.8\Eclipse Mars预备知识1、命令模式概述;2、命令模式的结构与实现;3、命令模式的应用实例;4、实现命令队列;5、记录请求日志;6、实现撤销操作;7、宏命令;8、命令模式的优缺点与适用环境。
实验(上机)内容为了用户使用方便,某系统提供了一系列功能键,用户可以自定义功能键的功能,例如功能键FunctionButton 可以用于退出系统(由SystemExitClass类来实现),也可以用于显示帮助文档(由DisplayHelpClass类来实现)。
用户可以通过修改配置文件爱改变功能键的用途,线使用命令模式来设计改系统,使得功能键类与功能类之间解耦,可为同一个功能键设置不同的功能。
新建解决方案,新建一个控制台应用程序,编写责任模式实现代码,实现以上需求的案例,要求编写为控制台应用程序,并能调试运行。
实验(上机)步骤1、本实例类图:2、创建Command的工程,并根据模式的角色创建对应的包。
3、FunctionButton:功能键类,充当请求调用者(请求发送者)。
package Invoker;import mand;public class FunctionButton {private Command command;public Command getCommand() {return command;}public void setCommand(Command command) {mand = command;}public void Click(){System.out.println("单击功能键!");command.Execute();}}4、Command:抽象命令类package Command;public abstract class Command {public abstract void Execute();}5、ExitCommand:退出命令类,充当具体命令类package ConcreteCommand;import mand;import Receiver.SystemExitClass;public class ExitCommand extends Command {private SystemExitClass seObj;public ExitCommand(){seObj = new SystemExitClass();}public void Execute(){seObj.Exit();}}6、HelpCommand:帮助命令类,充当具体命令类。
设计模式之(Command)命令行模式

设计模式之(Command)命令⾏模式
1.需求
为⼀个开关设计程序,这个开关有N按钮,同时对应N个插槽,要求可以接⼊任何电器⼚商的API,从⽽可以控制任何电器。
⽬前只有电灯和电视两种电器,要求写⼀个Demo程序,按钮1可以打开电灯。
按钮2可以打开电视并且切换到上⼀次打开的频道。
打开电视换频道需要打开机顶盒并且对机顶盒切换频道。
2. 分析
每个⼚商的API不⼀致,且每个电器的打开流程都不⼀样,我们需要将这些差异封装起来,才可以实现新增电器时不需要修改开关程序。
3. 类图
4. 总结
上⾯的例⼦主要通过Command模式将执运算块(⼏个对象和⼀组动作)打包变成⼀个统⼀的excute⽅法。
Comand除了可以实现excute,还可以实现undo(撤销),只需要为每个命令实现undo⽅法,就可以实现撤销的动作。
Command模式的⼀个常见的应⽤就是任务池,我们可以⾃定义很多任务,然后封装成command对象,交给任务池逐个执⾏。
Command模式实例(C#)

Command模式实例(C#)Command模式实例(C#)⽤命令模式设计⼀个公告板系统模块:某软件公司欲开发⼀个基于Windows平台的公告板系统。
系统提供⼀个主菜单(Menu),在主菜单中包含了⼀些菜单项(MenuItem),可以通过Menu类的addMenuItem()⽅法增加菜单项。
菜单项的主要⽅法是click(),每⼀个菜单项包含⼀个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有⼀个execute()⽅法,⽤于调⽤公告板系统界⾯类(BoardScreen)的open()、create()、edit()等⽅法。
现使⽤命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程实现。
类图:类图说明:由类图可见,Command抽象类下⾯实现了三个具体的类,分别是CreateCommand类、EditCommand类和OpenCommand类。
然后是⼀个Invoker——MenuItem类,Receiver——BoardScreen类。
Program类可以作为客户端的调⽤。
各类源码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CommandMenu{//receiver类public class BoardScreen{public void Open(){Console.WriteLine("Open Command Excute!");}public void Create(){Console.WriteLine("Create Command Excute!");}public void Edit(){Console.WriteLine("Edit Command Excute!");}}//Command类public abstract class Command{protected BoardScreen boardScreen;public Command(BoardScreen boardScreen){this.boardScreen = boardScreen;}abstract public void Execute();}//具体的command类public class OpenCommand : Command{public OpenCommand(BoardScreen boardScreen) : base(boardScreen) { }public override void Execute(){//throw new NotImplementedException();boardScreen.Open();}}public class CreateCommand : Command{public CreateCommand(BoardScreen boardScreen) : base(boardScreen) { } public override void Execute(){//throw new NotImplementedException();boardScreen.Create();}}public class EditCommand : Command{public EditCommand(BoardScreen boardScreen): base(boardScreen){ }public override void Execute(){//throw new NotImplementedException();boardScreen.Edit();}}//Invoker类public class MenuItem{private Command command;public void addMenuItem(Command command){mand = command;}public void click(){command.Execute();}}//客户端类class Program{static void Main(string[] args){BoardScreen boardScreen = new BoardScreen();MenuItem menuItem = new MenuItem();//使⽤OpenCommand类Command openCommand = new OpenCommand(boardScreen);menuItem.addMenuItem(openCommand);menuItem.click();//使⽤CreateCommand类Command creatCommand=new CreateCommand(boardScreen);menuItem.addMenuItem(creatCommand);menuItem.click();//使⽤EditCommand类Command editCommand = new EditCommand(boardScreen);menuItem.addMenuItem(editCommand);menuItem.click();Console.ReadKey();}}}运⾏结果图:直观关系图:。
设计模式Command_命令模式

Command(命令模式)Command(命令模式)属于行为型模式。
意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
举例子如果看不懂上面的意图介绍,没有关系,设计模式需要在日常工作里用起来,结合例子可以加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。
点菜是命令模式为什么顾客会找服务员点菜,而不是直接冲到后厨盯着厨师做菜?因为做菜比较慢,肯定会出现排队的现象,而且有些菜可能是一起做效率更高,所以将点菜和做菜分离比较容易控制整体效率。
其实这个社会现象就对应编程领域的命令模式:点菜就是一个个请求,点菜员记录的菜单就是将请求生成的对象,点菜员不需要关心怎么做菜、谁来做,他只要把菜单传到后厨即可,由后厨统一调度。
大型软件系统的操作菜单大型软件操作系统都有一个特点,即软件非常复杂,菜单按钮非常多。
但由于菜单按钮本身并没有业务逻辑,所以通过菜单按钮点击后触发的业务行为不适合由菜单按钮完成,此时可利用命令模式生成一个或一系列指令,由软件系统的实现部分来真正执行。
浏览器请求排队浏览器的请求不仅会排队,还会取消、重试,因此是个典型的命令模式场景。
如果不能将window.fetch序列化为一个个指令放入到队列中,是无法实现请求排队、取消、重试的。
意图解释意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
一个请求指的是来自客户端的一个操作,比如菜单按钮点击。
重点在点击后并不直接实现,而是将请求封装为一个对象,可以理解为从直接实现:function onClick() {// ... balabala 实现逻辑}改为生成一个对象,序列化这个请求:function onClick() {concreteCommand.push({// ... 描述这个请求})// 执行所有命令队列concreteCommand.executeAll()}看上去繁琐了一些,但得到了后面所说的好处:“从而使你可用不同的请求对客户进行参数化”,也就是可以对任何请求进行参数化存储,我们可以在任意时刻调用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件设计与体系结构
实 验 报 告
课程名称 软件设计与体系结构 课程编号
0920116
实验项目名称 命令模式案例
学号 班级
姓名 专业
学生所在学院 指导教师
实验室名称地点
实验时间
实验名称: 命令模式案例
实验目的:命令模式(Observer Pattern)是设计模式中行为模式的一种,它解决了上述具有一对
多依赖关系的对象的重用问题。此模式的参与者分为两大类,一类是被观察的目标,另一类是观
察该目标的观察者们。正因为该模式是基于“一对多”的关系,所以该模式一般是应用于由一个
目标对象和N个观察者对象组成(当然也可以扩展为有多个目标对象,但我们现在只讨论前者)
的场合。当目标对象的状态发生改变或做出某种行为时,正在观察该目标对象的观察者们将自动
地、连锁地作出相应的响应行为。
通过本次实验了解观察者模式的原理。并能够运用观察者模式来进行编程。
实验内容
1 UML类图
命令模式-烧烤店-松耦合设计:
2 程序的源代码
命令模式-烧烤店-松耦合设计:
package Bake;
public class BakeChickenWingCommand extends Command {
public BakeChickenWingCommand(Barbecuer receiver) {
super(receiver);
// TODO Auto-generated constructor stub
}
@Override
public void ExecuteCommand() {
// TODO Auto-generated method stub
receiver.BakeChickenWing();
}
}
package Bake;
public class BakeMuttonCommand extends Command {
public BakeMuttonCommand(Barbecuer receiver) {
super(receiver);
// TODO Auto-generated constructor stub
}
@Override
public void ExecuteCommand() {
// TODO Auto-generated method stub
receiver.BakeMutton();
}
}
package Bake;
public class Barbecuer {
public void BakeMutton(){
System.out.println("烤羊肉串");
}
public void BakeChickenWing(){
System.out.println("烤鸡翅");
}
}
package Bake;
public abstract class Command {
protected Barbecuer receiver;
public Command(Barbecuer receiver) {
super();
this.receiver = receiver;
}
abstract public void ExecuteCommand();
}
package Bake;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Waiter {
private List
public Waiter() {
super();
orders = new ArrayList
}
public void SetOrder(Command command){
if(command.toString().substring(0, 14).equals("Bake.BakeChick")){
System.out.println("鸡翅没有了,请点别的烧烤。");
}
// else if(command.toString().substring(0, 14).equals("Bake.BakeMutto")){
// System.out.println("The mutton have been sold out ,please try something else");
// }
else{
orders.add(command);
System.out.println("点餐:"+command.toString().substring(5, 15));
}
}
public void CancelOrder(Command command){
orders.remove(command);
System.out.println("取消点餐:"+command.toString().substring(0, 15));
}
public void Notify(){
ListIterator
while (i.hasNext()){
i.next().ExecuteCommand();
}
}
}
package Bake;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Barbecuer boy = new Barbecuer();
Command bm = new BakeMuttonCommand(boy);
Command bc = new BakeChickenWingCommand(boy);
Waiter Belldandy = new Waiter();
Belldandy.SetOrder(bm);
Belldandy.SetOrder(bc);
Belldandy.Notify();
}
}
3实验截图
命令模式-烧烤店-松耦合设计:
对该模式的认识
经过本次命令模式的实验,通过自己动手编代码,是自己理解命令模式机制,并且知道命令模式有以
下的优点: 适用性:想要实现回调函数功能,想要在不同的时刻指定、排列和执行请求,需要支持取消
和改变日志操作;效果:命令模式将调用操作的对象与知道如何实现该操作的对象解耦,Command是头
等的对象。它们可像任何其他对象一样被操纵和扩展,多个命令能被装配成一个复合命令。经过本次实验
课的练习,我明白了编代码也是一种技巧,而设计模式便是大家提炼出来的有技巧编代码。使我对软件设
计与体系结构这门课有了浓厚的兴趣,相信在学习这门课的知识,会让我获益良多。
扣分原因(有扣分时填写) 扣分