`

命令模式

阅读更多
今天想学学命令模式,看见了一个文章讲的就是命令模式,感觉实例比较简单直观就转载过来与大家分享。
文章如下:
案例:设计一个家电自动化的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();
}







Java代码 
/** 
*  遥控器测试 
*/ 
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完成),日志等这里就不再介绍了,其实都是相似的

个人总结如下:各个厂家分别提供不同的产品,每个产品都有一个自己的开关使用方法,要让遥控器可以不管底层的实现细节,可以插拔式操作各个工厂的产品,就可以考虑使用命令模式,即在遥控器和产品之间添加一层命令层。将命令层顶级接口与遥控器层使用组合的方式绑定到一起,然后让每个命令层的实现分别去绑定不同的产品,调用命令层接口的方法实际上操作的是产品的方法。这样当新添加厂商时,只需要添加一个命令层的实现类已经对应的产品类就可以了,在调用遥控器处根据传入的命令是什么,遥控器会执行对应的命令层的操作,也就执行到产品的操作了。(调用处需要创建对应的产品,和对应产品的命令,遥控器,将产品绑定到命令上,将命令绑定到遥控器上)
缺点:如果产品太多,会导致命令大量增多。造成代码量增多,有点和工厂方法模式比较相像
分享到:
评论

相关推荐

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

    命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...

    设计模式之命令模式源码示例

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

    设计模式-命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在iOS开发中,命令模式尤其适用于处理事件驱动的编程场景,因为...

    设计模式之命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...

    命令模式.zip

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C#编程中,命令模式常用于实现解耦发送者和接收者,提高代码的...

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

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求以便支持可撤消的操作。在这个简单的计算器例子中,我们将探讨如何使用命令模式来实现加法、...

    记事本 使用了策略模式和命令模式

    在“记事本 使用了策略模式和命令模式”这个主题中,我们将深入探讨这两种设计模式以及它们如何应用于记事本软件的实现。 首先,让我们了解策略模式。策略模式是一种行为设计模式,它允许在运行时选择算法或策略。...

    设计模式C++学习之命令模式(Command)

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中,命令模式的应用可以帮助我们更好地组织代码,提高代码的可扩展性和可维护性。...

    C#命令模式模型

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以参数化不同的请求,对请求排队或记录请求日志,以及支持可撤销的操作。C#作为.NET框架的主要编程语言,非常适合应用这种模式。本篇文章将深入探讨...

    设计模式之命令模式Java实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中实现命令模式,我们可以按照以下步骤进行: 1. **定义...

    C#命令模式应用

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C#编程中,命令模式常用于实现解耦,使得调用者与执行者之间...

    java 命令模式实例 (设计模式)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中,命令模式的应用非常广泛,尤其在需要解耦调用者和接收...

    命令模式代码示例

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本示例中,我们将深入探讨命令模式的核心概念和实现方式。 ...

    命令模式代码demo

    命令模式是一种设计模式,它将请求封装为一个对象,从而使我们能使用不同的请求、队列或者日志请求,以及支持可撤销的操作。在本代码demo中,我们将深入探讨这一模式的实现及其应用。 命令模式的核心思想是解耦调用...

    设计模式之命令模式案例代码

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本文中,我们将深入探讨命令模式的原理、结构和实际应用,并...

    java命令模式示例代码及类图

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中,命令模式的应用非常广泛,尤其在需要解耦调用者和执行...

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

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,命令模式的应用广泛且实用。 命令模式的核心是将...

    命令模式 C++ 实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C++中,我们可以利用面向对象的特性来有效地实现这个模式。 ...

    命令模式(多命令) - 代码(Java)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中实现命令模式,我们可以创建一个接口或者抽象类作为命令...

Global site tag (gtag.js) - Google Analytics