`

命令模式--(1)基本认识

阅读更多

什么是命令模式:

 

 

将请求(命令)封装为对象,实现将“发出请求的对象”与“接收和执行这些请求的对象”分隔开来

 

命令模式中有几个关键的概念:

 

客户:发起请求的对象,开关,或者你(因为开关是由你来控制的)

命令:具体的一个命令,比如开灯命令,关灯命令

执行者:接收和执行请求的对象,比如电灯,是开灯关灯命令的接收者和执行者

调用者:通过这个对象来实现客户(开关或你)和执行者(电灯)之间的耦合

 

命令模式支持撤销。对于这个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
0
1
分享到:
评论
2 楼 michaelye1988 2012-11-09  
sakajiaofu 写道
主要实现了调用者 和真正的动作实现者之间的解耦
也就是说中间会有一个过渡者 这个过渡者会和这两者进行交互


嗯,说的很好啊,这个过渡者就是RemoteInvoker。一对比,觉得自己语言能力还有待加强。谢谢指教。
1 楼 sakajiaofu 2012-11-09  
主要实现了调用者 和真正的动作实现者之间的解耦
也就是说中间会有一个过渡者 这个过渡者会和这两者进行交互

相关推荐

    linux_vi命令详解-屏幕文本编辑器Vi

    本文将深入解析Linux下的Vi命令,涵盖其基本概念、工作模式、命令使用及如何进入和退出Vi编辑器。 #### Vi编辑器概览 Vi,即"Visual interface",在Linux环境下扮演着类似DOS下Edit程序的角色。它不仅支持基本的...

    ftp常用命令介绍

    ### FTP常用命令详细介绍 FTP(File Transfer Protocol)是一种用于在网络上...通过以上对FTP命令的详细介绍,相信读者已经对FTP有了较为全面的认识,掌握了这些基本和进阶命令,可以大大提高文件传输的效率和灵活性。

    Linux的环境认识与常用命令使用.doc

    除了这些基本命令,还有许多其他的命令,如`mkdir`创建目录,`touch`创建或更新文件,`cat`查看文件内容,`more`或`less`分页查看文件,`find`查找文件,`grep`搜索文本模式等。熟练掌握这些命令,能极大提高在Linux...

    Access2003中文版应用基础教程part1

    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...

    Access2003中文版应用基础教程part2

    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...

    实验5-6--路由器基本配置和静态路由配置实验[归纳].pdf

    在配置过程中,学生将学习到一系列基本配置命令,比如interface命令用于进入接口配置模式,ip address命令用于为接口分配IP地址,mtu命令用于设置最大传输单元,shutdown命令和no shutdown命令用于关闭和启动接口。...

    曹一锋_Linux系统命令及其使用详解(大全) 236046688.doc

    通过本文介绍的一系列Linux命令,读者可以对Linux系统的基本操作有一个全面的认识。熟练掌握这些命令不仅能够提高日常工作的效率,还能够在解决具体问题时提供极大的帮助。希望本文能成为您学习Linux的好助手!

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    此外,探讨诸如“为什么使用设计模式——从Singleton模式谈起”的话题,可以帮助我们更好地认识到设计模式在软件工程中的价值。 #### 总结 设计模式是软件设计领域中的一项重要技能,能够帮助开发者编写出更为优雅...

    lunix命令集(shell基本语法).pdf

    ### Linux命令集与Shell基本语法知识点详解 #### 一、Linux目录结构 1. **目录树**: - 在Linux中,所有文件和目录都组织成一棵以`/`(根目录)为起点的树状结构,即所谓的“目录树”。 - 每个目录或文件都是这...

    例说51单片机C语言第三版练习程序

    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 变量名称与...

    linux命令集

    #### 一、认识命令行与基础命令 **1.1 命令行切换** - **热键切换**:通过`Ctrl + Alt + F1`至`Ctrl + Alt + F6`可以快速切换到不同的文本模式控制台。在虚拟机环境中可能需要同时按下`Shift`键才能生效。 - **切...

    .arch1-PS基础认识-素材.zip

    在".arch1-PS基础认识-素材.zip"这个压缩包中,我们可以找到一系列关于Photoshop基础学习的素材,这对于初学者来说是一份宝贵的资源。下面,我们将深入探讨Photoshop的基础知识和应用。 1. 工作界面:打开Photoshop...

    solaris操作系统基础知识.pdf

    - **grep命令基本用法**:`grep`用于在文本文件中搜索特定的字符串或模式。 - **文件的备份和恢复实用程序**: - **tar命令**:用于打包和解包文件,常用于备份操作。 - **cpio命令**:另一个用于存档和备份的命令...

    Pro-Objective-C-Design-Patterns-for-iOS

    同时,它还探讨了一些相对不太为人所熟知但同样有用的模式,比如备忘录模式(Memento)、组合模式(Composite)、命令模式(Command)和中介者模式(Mediator)。 书中详细介绍了各种设计模式的基本概念,帮助...

    Linux自学笔记,0基础到实战

    vi 是 Linux 中的一种文本编辑器,具有多种模式,包括普通模式、编辑模式、命令模式等。vi 的多模式文本编辑器可以满足用户的文本编辑需求。 用户管理常用命令 ------------------- Linux 中有多种用户管理命令,...

    linux救援模式详细描述

    通过以上介绍,相信你已经对Linux救援模式有了全面的认识,并掌握了进入救援模式的基本方法。在面对系统故障时,救援模式是一种非常有用的工具,能够帮助你快速定位问题并进行修复。无论是对于个人用户还是系统管理...

    VIM文本编辑器相关命令

    1. **命令模式**: - 移动:在命令模式下,可以使用方向键或H、J、K、L键进行上下左右移动。 - 复制:按`yy`复制当前行,然后使用`p`将复制的内容粘贴到最后一行。 - 剪切:按`dd`剪切当前行,同样使用`p`粘贴到...

    Java零基础 - DOS命令del.md

    例如,“cmd.exe”表示Windows下的命令行解释器,“/c”则表示命令模式,而“del C:\\path\\to\\file.txt”则是实际要执行的命令,即删除指定路径下的文件。 请注意将`C:\\path\\to\\file.txt`替换为您想要删除的...

Global site tag (gtag.js) - Google Analytics