好久没过来写blog了,今天写一下命令模式。
案例:设计一个家电自动化的API,这个遥控器具有几个可编程的插槽,每一个插槽都有对应的开关按钮,还有一些java类,这些类由多家厂商提供,控制家电自动化装置,
例如:电灯,风扇等。好了,此时就要创建一个控制遥控器的API出来,让每一个插槽都能够控制一个装置。
每个类都有on()/off()方法,除外可能还有其他方法(如:stop()方法等),而且厂商可能还会有更多。
首先,遥控器应该知道如何解读按钮被按下的动作,即命令,然后发出正确的请求,但是遥控器不需要知道这些家电自动化细节,与厂商解耦。
其次,可能有些人会想到用if判断语句:if command==Light then Light.on , else if command==GarageDoor then GarageDoor.stop 等增加判断来解决
但有个模式可以解决上面两种情况,OK,那就是命令模式,代码如下:
/**
* 命令接口
*/
public interface Command {
/**
* 只需要一个方法
*/
public void execute();
}
/**
* 厂商提供电灯
*/
public class Light {
public Light() {
}
public void on() {
System.out.println("Light is on");
}
public void off() {
System.out.println("Light is off");
}
}
/**
* 电灯打开命令,这是一个命令所以需要实现Command接口
*/
public class LightOnCommand implements Command {
Light light;
/**
* 构造器被传入了某个电灯,以便让这个命令控制,然后记录
* 在实例变量中。一旦调用execute/undo就由这个电灯对象
* 成为接受者,负责接受请求
*/
public LightOnCommand(Light light) {
this.light = light;
}
/**
* 调用接受者的on()方法
*/
public void execute() {
light.on();
}
}
/**
* 电灯关闭命令
*/
public class LightOffCommand implements Command {
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
public void execute() {
light.off();
}
}
/**
* 车库门
*/
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");
}
}
/**
* 车库门命令
*/
public class GarageDoorOpenCommand implements Command {
GarageDoor garageDoor;
public GarageDoorOpenCommand(GarageDoor garageDoor) {
this.garageDoor = garageDoor;
}
public void execute() {
garageDoor.up();
}
}
/**
* 简单遥控器
*/
public class SimpleRemoteControl {
/**
* 一个插槽持有命令,而这个命令控制着一个装置
*/
Command slot;
public SimpleRemoteControl() {}
/**
* 这个方法用来设置插槽控制的命令,如果
* 客户想要改变按钮行为,可以调用此方法
*/
public void setCommand(Command command) {
slot = command;
}
/**
* 当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽
*/
public void buttonWasPressed() {
slot.execute();
}
}
/**
* 遥控器测试
*/
public class RemoteControlTest {
public static void main(String[] args) {
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();
}
}
OK,可以看出命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来,此例中,请求这是遥控器,而执行者对象就是厂商类其中之一的实例。
命令模式定义:将“请求”封装称对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。可以知道,一个对象通过在特定的接受者上绑定一组动作来封装一个请求,
即命令对象将动作和接受者包进对象中,而这个对象只暴露一个execute方法。
命令模式类图如下:
OK,简单介绍了一下命令模式,这里只介绍了一下单个请求,对于一组请求(可以用一个让接受者包含一个数组命令,即让SimpleRemoteControl含有一个Command[]数组实例),
队列与一组请求类似(用Queue完成),日志等这里就不再介绍了,其实都是相似的
好了,今天课程结束,下课,呵。。。。。。
- 大小: 57.1 KB
分享到:
相关推荐
JAVA-设计模式-行为型模式-命令模式
c++设计模式-行为型模式-命令模式;qt工程 ;c++简单源码; 命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将...
6. **命令模式** - 可以利用QT4的QMetaObject系统和QSignalMapper来实现命令模式,通过信号触发不同的操作。 7. **适配器模式** - QT4的QAbstractItemModel和其子类允许将不同数据源适配到统一的模型接口,使得各种...
设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...
- 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持可撤销的操作。 - 解释器模式(Interpreter):给定一种语言,定义它的文法表示,并提供一个解释器来处理这种语言中的句子...
该PPT用于公司内部分享设计模式6---命令模式之用,言简意赅,形象生动.故此分享,希望大家一起学习
这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本专题中,我们将深入探讨命令模式,并通过Python和C++两种...
2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
在 Java 中,命令模式是一种行为设计模式,它将请求封装为对象,允许对客户端进行参数化,包括队列、请求和操作。该模式还支持可撤销的操作,增强了管理和执行命令的灵活性。 二、命令设计模式的别名 Action(动作)...
行为型模式主要涉及对象间责任分配和通信,比如策略模式(Strategy)、观察者模式(Observer)、职责链模式(Chain of Responsibility)、迭代器模式(Iterator)、命令模式(Command)和模板方法模式(Template ...
设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于...
创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
命令模式是一种行为设计模式,它的主要目的是将命令的发送者与接收者解耦。在“设计模式-command”中,我们看到这个模式的应用,通过将一个操作封装为一个对象(即命令对象),使得发送者可以无需知道接收者的具体...
- 命令模式(Command):将一个请求封装为一个对象,以便使用不同的请求、队列或者日志请求,支持可撤销的操作。 - 解释器模式(Interpreter):给定一种语言,定义它的文法表示,并提供一个解释器来处理该语言中...
在本文中,我们将深入探讨设计模式中的命令模式,并结合实际案例——WCS(Warehouse Control System,仓库控制系统)的堆垛机控制,来详细介绍其详细设计与实现。命令模式是一种行为设计模式,它将请求封装为一个...
### 设计模式--可复用面向对象软件的基础 #### 一、概述 ...总之,《设计模式--可复用面向对象软件的基础》不仅是一本经典的面向对象设计模式教材,也是一本值得反复阅读和深入思考的高级编程指南。
本书涵盖了各种经典的设计模式,包括创建型模式(如单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式)、结构型模式(如适配器模式、桥接模式、装饰模式、组合模式、外观模式、代理模式、享元模式)以及行为...