什么是命令模式:
将请求(命令)封装为对象,实现将“发出请求的对象”与“接收和执行这些请求的对象”分隔开来
命令模式中有几个关键的概念:
客户:发起请求的对象,开关,或者你(因为开关是由你来控制的)
命令:具体的一个命令,比如开灯命令,关灯命令
执行者:接收和执行请求的对象,比如电灯,是开灯关灯命令的接收者和执行者
调用者:通过这个对象来实现客户(开关或你)和执行者(电灯)之间的耦合
命令模式支持撤销。对于这个demo来说,开灯这个命令对应的撤销就是关灯。同理:关灯命令对应的撤销就是开灯。
LightOnCommand.java文件可以看到这一点,我通过一个List维护着用户的开灯和关灯的命令,当用户需要撤销的时候,从取出这个List的最后一个Command,执行它的undo()就实现了撤销。当然实现后你还要记得remove它,才能实现撤销到更早的Command。
这里我用一个ImageView当做灯泡。通过切换不同的图片,来实现on和off.
假如现在我要使用命令模式做一个类似按钮打开和关闭电灯的引用。实现效果如下图:
下面是工程结构:
我将开灯和关灯这两个命令封装成对象,它们都实现了Command接口,RemoteInvoker就是调用者。
下面上代码:
Command.java:
/**
* 这是第一步,让所有的命令对象实现相同的包含一个方法的接口
*
* */
public interface Command {
public void execute();
public void undo();
}
实现这个接口:
LightOnCommand.java:(LightOffCommand.java是类似的,只不过图片是相反的,这里就不贴代码了)
public class LightOnCommand implements Command{
private ImageView light;
public LightOnCommand(ImageView light){
this.light = light;
}
@Override
public void execute() {
light.setBackgroundResource(R.drawable.light_on);
}
@Override
public void undo() {
light.setBackgroundResource(R.drawable.light_off);
}
@Override
public String toString() {
return "On Command";
}
}
RemoteInvoker.java:
/**
* 这个就是遥控器类,这个类在这里还负责撤销操作
*
* */
public class RemoteInvoker {
Command slot;
Command onCommand;
Command offCommand;
LinkedList<Command> commandList;
Context context;
public RemoteInvoker(Context context) {
this.context = context;
commandList = new LinkedList<Command>();
}
public void setCommand(Command onCommand, Command offCommand){
this.onCommand = onCommand;
this.offCommand = offCommand;
}
public void onButtonWasPressed(){
onCommand.execute();
commandList.add(onCommand);
}
public void offButtonWasPressed(){
offCommand.execute();
commandList.add(offCommand);
}
public void undoButtonWasPressed(){
for(Command c: commandList){
Log.e("**********:", ":"+c.toString());
}
int sizeOfCommands = commandList.size();
if(sizeOfCommands <= 0){
Toast.makeText(context, "当前已经没有要撤销的对象了", Toast.LENGTH_SHORT).show();
}else{
Command lastCommand = commandList.get(sizeOfCommands - 1);//获取最后一个命令对象,执行它的undo方法
lastCommand.undo();
commandList.removeLast();//删除最后一个命令
}
}
}
最后是调用者类
MainActivity.java:
public class MainActivity extends Activity {
private RemoteInvoker remoteInvoker;
private LightOnCommand lightOnCommand;
private LightOffCommand lightOffCommand;
private ImageView light;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
light = (ImageView)findViewById(R.id.iv_light);//灯泡
Button btnOn = (Button)findViewById(R.id.btn_light_on);//开
Button btnOff = (Button)findViewById(R.id.btn_light_off);//关
Button btnUndo = (Button)findViewById(R.id.btn_undo);//撤销
//步骤1
lightOnCommand = new LightOnCommand(light);//实例化命令
lightOffCommand = new LightOffCommand(light);
//步骤2
remoteInvoker = new RemoteInvoker(this);
remoteInvoker.setCommand(lightOnCommand, lightOffCommand);//设置命令
btnOn.setOnClickListener(clickListener);
btnOff.setOnClickListener(clickListener);
btnUndo.setOnClickListener(clickListener);
}
private View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_light_on://开灯
remoteInvoker.onButtonWasPressed();
break;
case R.id.btn_light_off://关灯
remoteInvoker.offButtonWasPressed();
break;
case R.id.btn_undo://撤销
remoteInvoker.undoButtonWasPressed();
break;
default:
break;
}
}
};
}
这样做之后,你就当你要开灯或关灯的时候,就不需要直接对电灯的实例进行操作了,而是通过RemoteInvoker对象,你只要告诉这个对象,你按下了哪个按钮,其它的事情交个这个对象去处理。那么你和电灯之间就解耦了。
还有一点好处是,你可以实现命令的撤销。
当然,命令模式还支持批量执行命令,以及批量撤销命令。比如我只要按下一个按钮,那么多个命令(打开电灯,打开空调,打开电视就都开始执行),当我按关闭按钮,那么就撤销前面所有的命令。
还有队列请求和日志请求的功能,这些等到下次再结合实例讲解演示。
- 大小: 225.5 KB
- 大小: 34.3 KB
分享到:
相关推荐
本文将深入解析Linux下的Vi命令,涵盖其基本概念、工作模式、命令使用及如何进入和退出Vi编辑器。 #### Vi编辑器概览 Vi,即"Visual interface",在Linux环境下扮演着类似DOS下Edit程序的角色。它不仅支持基本的...
### FTP常用命令详细介绍 FTP(File Transfer Protocol)是一种用于在网络上...通过以上对FTP命令的详细介绍,相信读者已经对FTP有了较为全面的认识,掌握了这些基本和进阶命令,可以大大提高文件传输的效率和灵活性。
除了这些基本命令,还有许多其他的命令,如`mkdir`创建目录,`touch`创建或更新文件,`cat`查看文件内容,`more`或`less`分页查看文件,`find`查找文件,`grep`搜索文本模式等。熟练掌握这些命令,能极大提高在Linux...
8-1-1 认识工具箱与控件 8-1-2 建立新的空白窗体 8-1-3 建立新的控件 8-2 控件的高级编辑技巧 8-2-1 复制控件 8-2-2 复制控件的格式 8-2-3 设置控件的Tab键顺序 8-3 控件的应用 8-3-1 自制数据操作按钮 8-3...
8-1-1 认识工具箱与控件 8-1-2 建立新的空白窗体 8-1-3 建立新的控件 8-2 控件的高级编辑技巧 8-2-1 复制控件 8-2-2 复制控件的格式 8-2-3 设置控件的Tab键顺序 8-3 控件的应用 8-3-1 自制数据操作按钮 8-3...
在配置过程中,学生将学习到一系列基本配置命令,比如interface命令用于进入接口配置模式,ip address命令用于为接口分配IP地址,mtu命令用于设置最大传输单元,shutdown命令和no shutdown命令用于关闭和启动接口。...
通过本文介绍的一系列Linux命令,读者可以对Linux系统的基本操作有一个全面的认识。熟练掌握这些命令不仅能够提高日常工作的效率,还能够在解决具体问题时提供极大的帮助。希望本文能成为您学习Linux的好助手!
此外,探讨诸如“为什么使用设计模式——从Singleton模式谈起”的话题,可以帮助我们更好地认识到设计模式在软件工程中的价值。 #### 总结 设计模式是软件设计领域中的一项重要技能,能够帮助开发者编写出更为优雅...
### Linux命令集与Shell基本语法知识点详解 #### 一、Linux目录结构 1. **目录树**: - 在Linux中,所有文件和目录都组织成一棵以`/`(根目录)为起点的树状结构,即所谓的“目录树”。 - 每个目录或文件都是这...
2-1-1 认识mvision3环境 34 2-1-2 项目管理与选项 37 2-1-3 认识调试/仿真环境 39 2-1-4 外围操作 40 2-2 keil c语言的基本结构 43 2-3 变量、常数与数据类型 47 2-3-1 数据类型 47 2-3-2 变量名称与...
#### 一、认识命令行与基础命令 **1.1 命令行切换** - **热键切换**:通过`Ctrl + Alt + F1`至`Ctrl + Alt + F6`可以快速切换到不同的文本模式控制台。在虚拟机环境中可能需要同时按下`Shift`键才能生效。 - **切...
在".arch1-PS基础认识-素材.zip"这个压缩包中,我们可以找到一系列关于Photoshop基础学习的素材,这对于初学者来说是一份宝贵的资源。下面,我们将深入探讨Photoshop的基础知识和应用。 1. 工作界面:打开Photoshop...
- **grep命令基本用法**:`grep`用于在文本文件中搜索特定的字符串或模式。 - **文件的备份和恢复实用程序**: - **tar命令**:用于打包和解包文件,常用于备份操作。 - **cpio命令**:另一个用于存档和备份的命令...
同时,它还探讨了一些相对不太为人所熟知但同样有用的模式,比如备忘录模式(Memento)、组合模式(Composite)、命令模式(Command)和中介者模式(Mediator)。 书中详细介绍了各种设计模式的基本概念,帮助...
vi 是 Linux 中的一种文本编辑器,具有多种模式,包括普通模式、编辑模式、命令模式等。vi 的多模式文本编辑器可以满足用户的文本编辑需求。 用户管理常用命令 ------------------- Linux 中有多种用户管理命令,...
通过以上介绍,相信你已经对Linux救援模式有了全面的认识,并掌握了进入救援模式的基本方法。在面对系统故障时,救援模式是一种非常有用的工具,能够帮助你快速定位问题并进行修复。无论是对于个人用户还是系统管理...
1. **命令模式**: - 移动:在命令模式下,可以使用方向键或H、J、K、L键进行上下左右移动。 - 复制:按`yy`复制当前行,然后使用`p`将复制的内容粘贴到最后一行。 - 剪切:按`dd`剪切当前行,同样使用`p`粘贴到...
例如,“cmd.exe”表示Windows下的命令行解释器,“/c”则表示命令模式,而“del C:\\path\\to\\file.txt”则是实际要执行的命令,即删除指定路径下的文件。 请注意将`C:\\path\\to\\file.txt`替换为您想要删除的...