命令模式(command pattern) 详细解释

本文地址: http://blog.csdn.net/caroline_wendy

命令模式(command pattern) : 将请求封装成对象, 以便使用不同的请求\队列\日志来參数化其它对象.

命令模式也能够支持撤销操作.

简单的命令模式的实现:

1. 详细的类, 每个类都有特定的方法:

/**
* @time 2014年6月9日
*/
package command; /**
* @author C.L.Wang
*
*/
public class Light { public Light() {} public void on() {
System.out.println("Light is on");
} public void off() {
System.out.println("Light is off");
} } /**
* @time 2014年6月9日
*/
package command; /**
* @author C.L.Wang
*
*/
public class GarageDoor { public GarageDoor() {} public void up() {
System.out.println("Garage Door is Open");
} public void down() {
System.out.println("Garage Door is Closed");
} public void stop() {
System.out.println("Garage Door is Stopped");
} public void lightOn() {
System.out.println("Garage light is on");
} public void lightOff() {
System.out.println("Garage light is off");
}
}

2. 命令接口, 提供全部命令的接口, 详细命令继承接口, 并实现方法:

/**
* @time 2014年6月9日
*/
package command; /**
* @author C.L.Wang
*
*/
public interface Command {
public void execute();
}

2. 详细的命令实现, 即把详细类的函数, 封装入命令接口:

/**
* @time 2014年6月9日
*/
package command; /**
* @author C.L.Wang
*
*/
public class LightOnCommand implements Command { Light light; public LightOnCommand (Light light) {
this.light = light;
} /* (non-Javadoc)
* @see command.Command#execute()
*/
@Override
public void execute() {
// TODO Auto-generated method stub
light.on();
} } /**
* @time 2014年6月9日
*/
package command; /**
* @author C.L.Wang
*
*/
public class GarageDoorOpenCommand implements Command { GarageDoor garageDoor; public GarageDoorOpenCommand (GarageDoor garageDoor) {
this.garageDoor = garageDoor;
} /* (non-Javadoc)
* @see command.Command#execute()
*/
@Override
public void execute() {
// TODO Auto-generated method stub
garageDoor.up();
} }

3. 接受者, 运行请求, 传入命令參数, 统一运行命令:

/**
* @time 2014年6月9日
*/
package command; /**
* @author C.L.Wang
*
*/
public class SimpleRemoteControl { Command slot; public SimpleRemoteControl() {} public void setCommand(Command command) {
this.slot = command;
} public void buttonWasPressed() {
slot.execute();
}
}

4. 运行类, 新建详细类, 新建详细命令, 把详细命令传入接收者类, 运行统一动作:

/**
* @time 2014年6月9日
*/
package command; /**
* @author C.L.Wang
*
*/
public class RemoteControlTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
GarageDoor garageDoor = new GarageDoor();
LightOnCommand lightOn = new LightOnCommand(light);
GarageDoorOpenCommand garageOpen =
new GarageDoorOpenCommand(garageDoor); remote.setCommand(lightOn);
remote.buttonWasPressed();
remote.setCommand(garageOpen);
remote.buttonWasPressed(); } }

5. 输出:

Light is on
Garage Door is Open

设计模式 - 命令模式(command pattern) 具体解释的更多相关文章

  1. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  2. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  3. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  4. C#设计模式——命令模式(Command Pattern)

    一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...

  5. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  6. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  7. 设计模式-15命令模式(Command Pattern)

    1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...

  8. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  9. 设计模式 - 迭代器模式(iterator pattern) 具体解释

    迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...

随机推荐

  1. mongodb的tailCursor的设计思想

    http://derickrethans.nl/mongodb-and-solr.html 这是mongodb的php客户端的写法

  2. C# - openxml 操作excel - '“System.IO.Packaging.Package”在未被引用的程序集中定义'

    在 CodeProject中,有位网友写的一篇基于OpenXML SDK 2.0对excel(大数据量)进行操作,其中,运行的时候,有如下错误: 类型“System.IO.Packaging.Pack ...

  3. pod install后出现: [!] `<PBXResourcesBuildPhase UUID=`xxxx`>` attempted to initialize an object with an unknown UUID

    [!] `<PBXResourcesBuildPhase UUID=`xxx`>` attempted to initialize an object with an unknown UU ...

  4. 学习OpenSeadragon之一(一个显示多层图片的开源JS库)

    OpenSeadragon是一个可以显示多层图片(可放大缩小)的Web库,基于JavaScript,支持桌面和手机. 由于我项目需要,却没有找到任何中文教程,因此在官网上一边学习,一边总结于此. 官网 ...

  5. Centos 6.5 搭建php环境(nginx+mariadb+php7)

    1.mariaDb vim /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.or ...

  6. PHPCMS V9 如何启用伪静态

    最近在研究CMS时候,首先是使用DEDECMS,后来又转到了PHPCMS,感觉后者架构更加合理,而前者主要是模板众多,故使用者多一些,不过我都是需要自己写模板,那就无所谓了. 玩各种CMS我喜欢首先看 ...

  7. ANDROID 自动生成动态表格for

    简单的栗子去了解这个自动生成的动态的控件(自动生成表格) /cs-Layout/res/layout/activity_main.xml <LinearLayout xmlns:android= ...

  8. Windows下python安装matplotlib

    此文为转载,原文地址为:http://blog.csdn.net/u010585135/article/details/42127273 一.下载matplotlib安装包:网址http://matp ...

  9. Altium Designer 14(或者其他版本)里更改PCB板(图纸)大小

    1.在PCB板界面下方有一行不同颜色的图层选项,找到“Keep-Out Layer”,没看见的话点击右箭头即可找到.   2.在“Place”选项里面选择“line”,也就是添加线,把你所有元件用线条 ...

  10. 【转】Android UI系列-----时间、日期、Toasts和进度条Dialog

    原文网址:http://www.cnblogs.com/xiaoluo501395377/p/3421727.html 您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注 ...