命令模式案例实验报告
- 格式:doc
- 大小:56.00 KB
- 文档页数:5
命令模式的应用实例
命令模式是一种常见的设计模式,它能够将一个命令封装成一个对象,使得命令的执行、撤销、重做等操作变得更加简单和灵活。
在实际应用中,命令模式有广泛的应用场景,下面将介绍几个典型的例子。
第一个例子是文本编辑器中的撤销操作。
我们在文本编辑器中常常会使用撤销操作,通过撤销操作可以将之前的操作全部撤销掉。
实际上,撤销操作就是命令模式的应用。
每个操作都可以被封装成一个命令对象,每个命令对象可以保存操作前的状态,执行撤销操作时,只需要按照命令对象的反向指令来执行即可。
第二个例子是遥控器控制器。
在大多数家庭中,我们都会有遥控器控制电视、音响等设备。
这些设备的遥控器都具备命令模式的特点,每个按钮都对应一个命令,按下按钮就执行相应的命令。
遥控器还可以实现撤销、重做等操作,只需要记录每个命令执行前的状态即可。
第三个例子是游戏中的角色操作。
在游戏中,我们可以通过键盘、鼠标等输入设备来控制角色的动作。
这些操作都可以通过命令模式来实现,每个动作都对应一个命令对象,当玩家按下相应的键时,就执行相应的命令,可以实现多个动作的组合,还可以撤销、重做等操作。
通过上述例子,我们可以看出命令模式在实际应用中的广泛性和灵活性。
命令模式能够将命令与具体操作的实现分离,使得系统更加灵活和易于扩展。
在开发过程中,我们可以根据具体需求来选择合适的命令对象来执行相应的操作,从而提高系统的效率和可维护性。
因此,在设计系统时,有必要充分考虑命令模式的应用,以实现更加高效、灵活和可维护的系统。
《计算机网络》课程实验报告实验一:网络命令、工具使用和效劳器配置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信息效劳所有选项→确定,稍微等几分钟。
实验一、命令解释程序的编写实验专业:软件工程姓名:麦婉仪学号: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 进行嵌套。
实验(上机)十一命令模式实验(上机)目的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)命令⾏模式
1.需求
为⼀个开关设计程序,这个开关有N按钮,同时对应N个插槽,要求可以接⼊任何电器⼚商的API,从⽽可以控制任何电器。
⽬前只有电灯和电视两种电器,要求写⼀个Demo程序,按钮1可以打开电灯。
按钮2可以打开电视并且切换到上⼀次打开的频道。
打开电视换频道需要打开机顶盒并且对机顶盒切换频道。
2. 分析
每个⼚商的API不⼀致,且每个电器的打开流程都不⼀样,我们需要将这些差异封装起来,才可以实现新增电器时不需要修改开关程序。
3. 类图
4. 总结
上⾯的例⼦主要通过Command模式将执运算块(⼏个对象和⼀组动作)打包变成⼀个统⼀的excute⽅法。
Comand除了可以实现excute,还可以实现undo(撤销),只需要为每个命令实现undo⽅法,就可以实现撤销的动作。
Command模式的⼀个常见的应⽤就是任务池,我们可以⾃定义很多任务,然后封装成command对象,交给任务池逐个执⾏。
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(命令模式)属于行为型模式。
意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
举例子如果看不懂上面的意图介绍,没有关系,设计模式需要在日常工作里用起来,结合例子可以加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。
点菜是命令模式为什么顾客会找服务员点菜,而不是直接冲到后厨盯着厨师做菜?因为做菜比较慢,肯定会出现排队的现象,而且有些菜可能是一起做效率更高,所以将点菜和做菜分离比较容易控制整体效率。
其实这个社会现象就对应编程领域的命令模式:点菜就是一个个请求,点菜员记录的菜单就是将请求生成的对象,点菜员不需要关心怎么做菜、谁来做,他只要把菜单传到后厨即可,由后厨统一调度。
大型软件系统的操作菜单大型软件操作系统都有一个特点,即软件非常复杂,菜单按钮非常多。
但由于菜单按钮本身并没有业务逻辑,所以通过菜单按钮点击后触发的业务行为不适合由菜单按钮完成,此时可利用命令模式生成一个或一系列指令,由软件系统的实现部分来真正执行。
浏览器请求排队浏览器的请求不仅会排队,还会取消、重试,因此是个典型的命令模式场景。
如果不能将window.fetch序列化为一个个指令放入到队列中,是无法实现请求排队、取消、重试的。
意图解释意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
一个请求指的是来自客户端的一个操作,比如菜单按钮点击。
重点在点击后并不直接实现,而是将请求封装为一个对象,可以理解为从直接实现:function onClick() {// ... balabala 实现逻辑}改为生成一个对象,序列化这个请求:function onClick() {concreteCommand.push({// ... 描述这个请求})// 执行所有命令队列concreteCommand.executeAll()}看上去繁琐了一些,但得到了后面所说的好处:“从而使你可用不同的请求对客户进行参数化”,也就是可以对任何请求进行参数化存储,我们可以在任意时刻调用。
Linux基本命令及其使用实验目的:1.理解Shell命令的运行;2.掌握Linux基本命令的使用;3.通过对现象的观察、总结与思考,理解linux命令的学习方法;实验步骤:1.进入~目录,然后显示当前目录全路径。
2.在当前目录下建立lab1子目录,进入lab1。
3.执行echo “hello world”>my.txt,使用ls -l查看当前目录下的文件信息。
再执行echo “hello world” my.txt。
对照这些结果,说明>的作用与功能。
echo >“hello world”my.txt将字符串输出重定向,当前目录没有my.txt,则创建my.txt,并将字符串输出到my.txt文件中my.txt内容:hello worldecho “hello world” my.txt将字符串“hello world” my.txt输出到屏幕4.再次执行echo “hello world”>my2.txt,使用cat命令查看my2.txt文件内容。
又执行echo “hello world”>>my2.txt,再次使用cat命令查看my2.txt文件内容。
对比分析两次cat内容的差别,回答>>的功能与作用。
执行echo “hello world”>>my2.txt后将字符串“hello world”追加到my2.txt文件中5.使用ls显示当前目录下的文件名,比较ls -a以及ls -A结果的区别。
比较ls -l 与ls -li的区别ls -l将文件的详细内容列举出来ls -li在-l的基础上增加了每个文件的 inode 号,inode 相当于索引节点操作系统用inode号码来识别不同的文件6.输入who,执行,根据显示信息分析who命令的(可能)功能。
显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等7.在当前目录下建立mydir目录,将以上的my2.txt拷贝到mydir目录下。
中南大学Linux操作系统实验报告学生姓名学院信息科学与工程学院指导老师胡小龙专业班级完成时间目录1.实验一Linux的安装 (3)1.1 实验目的 (3)1.2 实验设备 (3)1.3 实验原理 (3)1.4 实验步骤 (3)2. 实验二Linux基本操作 (5)2.1 实验目的 (5)2.2 实验设备 (5)2.3 实验原理 (6)2.4 实验步骤 (6)3. 实验三Linux系统管理 (10)3.1 实验目的 (10)3.2 实验设备 (10)3.3 实验原理 (10)3.4 实验步骤 (11)4. 实验四Linux Shell程序设计 (14)4.1 实验目的 (14)4.2 实验设备 (14)4.3 实验原理 (15)4.4 实验步骤 (17)5. 实验五Linux 高级程序设计 (20)5.1 实验目的 (20)5.2 实验设备 (21)5.3 实验原理 (21)5.4 实验步骤 (21)6. 实验六Linux内核 (23)6.1 实验目的 (23)6.2 实验设备 (23)6.3 实验原理 (23)6.4 实验步骤 (23)Linux操作系统1.实验一Linux的安装1.1 实验目的(1)了解硬盘分区的概念和方法;(2)掌握硬盘的分区规划;(3)掌握Linux操作系统的安装和配置过程。
1.2 实验设备一台pc机、RedHat Linux 7.2以上版本、VMware Workstation v5.5。
1.3 实验原理Linux可以以多种方式安装在PC机上:(1)独立分区安装、(2)DOS分区安装和(3)虚拟机VMWare下安装。
鉴于VMware下安装对原来系统影响较小且不影响本实验目的,因此采用VMWare下安装方式。
1.4 实验步骤(1)在Windows XP下安装VMware 5.5(2)配置虚拟机(3)启动虚拟机(4)启动Linux安装过程(5)安装过程配置(6)安装后配置(7)第1次启动VMWare下Linux操作系统2.实验二Linux基本操作2.1 实验目的(1)复习Linux基本命令;(2)掌握常用Linux命令。
软件设计与体系结构
实 验 报 告
课程名称 软件设计与体系结构 课程编号
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是头
等的对象。它们可像任何其他对象一样被操纵和扩展,多个命令能被装配成一个复合命令。经过本次实验
课的练习,我明白了编代码也是一种技巧,而设计模式便是大家提炼出来的有技巧编代码。使我对软件设
计与体系结构这门课有了浓厚的兴趣,相信在学习这门课的知识,会让我获益良多。
扣分原因(有扣分时填写) 扣分