`
543089122
  • 浏览: 153162 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

简单_命令模式(command)

阅读更多
命令模式定义:命令模式用一句话表示就是说:一个命令一个类。在面向对象程式设计的范畴中,命令模式是一种设计模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

先来看一看我本人认为每个人学设计模式不得不看的图,尽管“奇丑无比”,甚至曾经“束缚过我们的思想”


这个模式非常的简单,许多人都说JDK中的
java.lang.Runnable
javax.swing.Action
使用到了此模式,但javax.swing.Action我没看出来,可能是我眼拙只看到用了listener模式,这个很明显。

--------------------
网上都说命令模式的简单例子是这样的:玉帝下达了一道命令封孙悟空为弼马温,要太上老君去执行。下面以此来模拟命令模式。
package design.command;
/** 
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午09:55:26 <br>
 * 命令接口
 */
public interface Command {
	void execute();
}

package design.command;

/**
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午09:55:51 <br>
 * 圣旨
 */
public class ConcreteCommand implements Command {

	private Receiver rev;

	public ConcreteCommand(Receiver rev) {
		this.rev = rev;
	}

	public void execute() {
		System.out.println("command.execute");
		this.rev.action();
	}

}

package design.command;
/** 
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午09:56:28 <br>
 * 命令的接受者
 */
public class Receiver {
	public void action(){
		System.out.println("receiver.action");
	}
}

package design.command;

/**
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午09:58:17 <br>
 * 命令的执行者
 */
public class Invoker {
	private Command command;

	public Invoker(Command command) {
		this.command = command;
	}

	//设置执行者要执行的命令
	public void setCommand(Command command) {
		this.command = command;
	}

	//执行命令
	public void runCommand() {
		System.out.println("Invoker.runCommand");
		this.command.execute();
	}
}

package design.command;
/** 
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午09:54:54 <br>
 * 
 */
public class Test {
	public static void main(String[] args) {
		/*
		 * 命令模式:
		 * 玉帝下达了一道命令封孙悟空为弼马温,要太上老君去执行
		 */
		Receiver rev = new Receiver();//创建孙悟空----接受命令的人
		Command command = new ConcreteCommand(rev);//创建一道给孙悟空的圣旨----命令
		Invoker invoker = new Invoker(command);//创建执行该圣旨的人----太上老君
		invoker.runCommand();//太上老君宣读该圣旨
		
		//写成一句话(太上老君对孙悟空宣读圣旨)
		new Invoker(new ConcreteCommand(new Receiver())).runCommand();
	}
}

这样是命令模式正规的写法,反正是照着图片画代码,但是很显然我们的客户端的调用太啰嗦,客户端根本没必要做这么多事情,客户端其只要创建一个太上老君然后给他一道圣旨就OK了。
看下面改进后的代码(为了不产生混淆下面的代码和上面的不相关):
package design.command2;
/** 
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午10:32:20 <br>
 * 
 */
public interface Command {
	void execute();
}

package design.command2;
/** 
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午10:32:43 <br>
 * 改进后,接受者不在是一个具体的类而是一个抽象的接受者
 */
public interface Receiver {
	void action();
}

package design.command2;

/**
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午10:33:27 <br>
 * 圣旨--命令
 */
public class ShengzhiCommand implements Command {

	//圣旨需要持有一个接受者的引用
	private Receiver rev;

	public ShengzhiCommand(Receiver rev) {
		this.rev = rev;
	}

	public void execute() {
		this.rev.action();
	}

}

package design.command2;
/** 
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午10:34:29 <br>
 * 孙悟空------接受者
 */
public class SunWuKongReceiver implements Receiver{

	public void action() {
		System.out.println("孙悟空执行去当弼马温的圣旨");
	}
}

package design.command2;

/**
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午10:35:28 <br>
 * 太上老君----命令的执行者
 */
public class TaiShangLaoJunInvoker {
	private Command command;

	public void setCommand(Command command) {
		this.command = command;
	}

	public void runCommand() {
		this.command.execute();
	}
}

package design.command2;
/** 
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-2-1 下午10:32:07 <br>
 * 
 */
public class Test {
	public static void main(String[] args) {
		TaiShangLaoJunInvoker t = new TaiShangLaoJunInvoker();
		//只需要告诉太上老君 圣旨和孙悟空就行了
		t.setCommand(new ShengzhiCommand(new SunWuKongReceiver()));
		t.runCommand();
//		t.runCommand();
	}
}

很明显改进后客户端调用起来清晰多了。

最后:回归设计模式的自然美,为什么说是自然美呢?因为我打心眼里觉得设计真的很美,如果按照设计模式的图纸去写个例子出来其实并不难,但真正的理解设计模式然后灵活的运用却非常不容易,照着图纸写几个类其实你还是局限在设计模式的条条框框中。
其实真正的去理解一个模式最好的办法是看它存在的意义,也就是它是为什么而生的,如果无法理解它存在的真正的意义那估计是很难学好设计模式的,而其他的枝枝叶叶的都可以暂时不管,这是我学设计模式的体会。就拿此模式来说,其存在的目的就是把命令搞成对象的形式,理解了这就够了,然后那些枝枝叶叶的啊全当扯蛋,先把精髓理解了在理解枝枝叶叶,然后结合JDK看模式会发现相当简单。
都说java.lang.Runnable是命令模式,如果较真的和图片去比较那确实不是,但它其实是命令模式,反正不管东西南北,只要把命令搞成对象的形式能执行、取消、记录等等就都算命令模式了,这也算是模式回归自然吧,一种广义的理解,可能狭义的理解就是图片的样子了。
如果学模式老抱着个图片死在那看估计越学越受打击,最后落得个设计模式恐惧症。
前几天iteye不就有人把设计模式搞成chm的文件吗!

所以运用设计模式在于运用其思想而非招式,菜鸟就算给他把绝世宝剑也杀不了人,但独孤前辈却能用树枝杀人。李小龙对武术的理解是去除繁杂的招式,没必要搞的明明要打别人一拳却先翻几个跟头然后转几圈。。。何必呢。
  • 大小: 136.3 KB
1
0
分享到:
评论

相关推荐

    ansys_command.rar_ANSYS 命令流_ANSYS命令流_ansys_ansys command_命令流

    本资源"ansys_command.rar"显然旨在帮助初学者掌握ANSYS命令流的使用。 在ANSYS命令流中,用户可以定义模型、施加边界条件、设定载荷、选择求解器以及后处理等所有步骤。以下是一些关键的ANSYS命令流知识点: 1. *...

    命令模式_Command

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在IT行业中,命令模式广泛应用于软件架构和系统设计,以提高代码...

    esp8266_at_command

    ESP8266支持多种工作模式,可通过AT+CWMODE命令设置。 - **命令格式**:`AT+CWMODE=&lt;mode&gt;` - **参数**: - `&lt;mode&gt;`:可选值为1(Station模式)、2(Soft-AP模式)、3(Station+Soft-AP模式) - **示例**:设置ESP...

    命令模式(Command模式)

    以下是一个简单的命令模式示例,涉及开关灯的操作: ```java // 接收者:灯 interface Light { void on(); void off(); } // 具体命令:开灯命令 class TurnOnCommand implements Command { private Light ...

    设计模式之Command(命令)模式

    2. **不适用于简单操作**:如果一个操作过于简单,使用命令模式可能会显得过度设计。 **案例分析** 在提供的资源中,"计算器"可能是使用Command模式的一个实例。每个运算(加法、减法等)可以看作一个具体的命令,...

    命令模式 Command Pattern

    ### 命令模式(Command Pattern) #### 概述 命令模式是一种行为设计模式,它将请求封装成对象,以便使用不同的请求对客户端进行参数化。该模式有助于将发送请求的对象与执行请求的对象解耦。 #### 核心概念 在...

    AT_command_命令集

    - **ATO**:返回在线模式,用于将调制解调器从命令模式切换到在线模式。 - **ATQ**:结果代码抑制,用于抑制命令执行后的结果代码输出。 - **ATV**:响应格式,用于设置命令响应的格式。 - **ATZ**:缺省配置,用于...

    命令(command)模式

    在给定的压缩包文件"command_02"中,可能包含了一些关于命令模式的实例代码或者进一步的解释。通常,这样的文件会展示如何创建命令接口、具体命令类、请求者和接收者类,并演示如何在程序中使用这些类来实现命令模式...

    Head First 设计模式 (六) 命令模式(Command pattern) C++实现

    以下是一个简单的C++命令模式实现示例: ```cpp // 命令接口 class Command { public: virtual void execute() = 0; }; // 具体命令 class ConcreteCommand1 : public Command { private: Receiver* receiver; ...

    Putal TCP_IP_MMS AT COMMAND_v2.2.pdf

    - **说明**:通过简单的文本格式发送短信。 #### 3. 用PDU模式发送短信(PDU MODE) - **说明**:通过更复杂的协议数据单元(PDU)格式发送短信。 #### 4. 发送彩信图片 - **说明**:利用MMS功能发送包含图片的消息...

    Command命令模式介绍.docx

    ### Command命令模式详解 #### 概述 Command命令模式是一种常用的设计模式,属于对象行为型模式之一。它的核心思想在于将请求封装成一个对象,从而让发出请求的对象和执行请求的对象解耦。这种方式有助于实现软件...

    设计模式之命令模式

    例如,以下是一个简单的Java命令模式示例: ```java // 命令接口 public interface Command { void execute(); } // 具体命令类 public class ConcreteCommand implements Command { private Receiver receiver;...

    设计模式-命令模式(讲解及其实现代码)

    下面以一个简单的例子来解释命令模式的工作原理:假设我们有一个遥控器,它可以控制多个家用电器,如电视、空调和风扇。遥控器是调用者,而电视、空调和风扇是接收者。每个家电都有自己的开关操作,这些操作被封装成...

    The_Linux_Command_Line(中文版)

    - **简单命令的执行**:例如,`ls` 命令可以用来列出当前目录下的文件和目录。 - **结束终端会话**:使用 `exit` 或 `Ctrl+D` 可以退出当前的Shell会话。 - **幕后控制台**:指的是物理连接到计算机的终端,通常用于...

    命令模式实现简单计算器功能包括撤销

    在这个简单的计算器例子中,我们将探讨如何使用命令模式来实现加法、减法运算以及撤销功能。 首先,我们有以下几个主要角色: 1. **命令接口(Command)**:定义了执行特定计算操作的抽象方法,如`execute()`。例如...

    设计模式--命令模式java例子

    下面是一个简单的Java命令模式示例: ```java // 接收者接口 interface Receiver { void action(); } // 具体接收者类 class ConcreteReceiver implements Receiver { @Override public void action() { ...

    命令模式最简单实现

    在本例中,我们将探讨命令模式的最简单实现,专注于模式的核心概念。 **核心概念** 1. **命令接口(Command Interface)**:这是所有具体命令类必须实现的接口,通常包含一个执行操作的方法,如`execute()`。这个...

    设计模式之Command模式和代码实现

    Command模式是一种行为设计模式,它的主要目的是将命令的发起者(Invoker)与命令的执行者(Receiver)解耦。在Command模式中,一个命令对象封装了特定的请求,调用者(Invoker)只需要知道如何发送命令,而无需知道...

    sms.zip_GSM SMS_at command

    标题中的“sms.zip_GSM SMS_at command”表明这个压缩包包含与GSM短信服务相关的AT命令的资源。...了解和熟练使用这些AT命令对于开发GSM相关的物联网应用、远程控制系统或简单的短信服务应用至关重要。

Global site tag (gtag.js) - Google Analytics