JavaRush /Java 博客 /Random-ZH /用你自己的话来说命令模式
Roman_kh
第 33 级
Харьков

用你自己的话来说命令模式

已在 Random-ZH 群组中发布

各位论坛会员大家好!

我已经彻底(在我看来)弄清楚了这个模式Command,我想尝试“用我自己的话”来谈论它。 用你自己的话来说命令模式 - 1根据维基百科,我们可以发现它的目的是创建一个发送类和接收类不直接依赖的结构。组织对包含发送者类的类的回调。原则上写得清楚、正确,但这只是理论上的。这个怎么做?这就是问题开始的地方,因为…… 描述不再那么清晰和明显。因此,我想通了,我决定告诉你我是如何理解它的,也许这对某人有用:基于对这个模式的目的的描述,我将把描述与代码结合起来,使它更加清晰,因为 在同一个维基百科中,他们将其概括为多种语言,因此描述与示例分开。该模式中有四个术语,我们暂时认为它们是理所当然的:命令(command)、命令接收者(receiver)、命令调用者(invoker)和客户端(client)。我将从同一个维基百科中举一个例子,这是相当可以忍受的。 该任务 是一个可以做两件事的类Light:开灯和关灯。就模式而言,它将是“命令接收者(receiver)”
/*Receiver class*/

public class Light{
     public Light(){  }

     public void turnOn(){
        System.out.println("The light is on");
     }

     public void turnOff(){
        System.out.println("The light is off");
     }
}
让我们创建一个接口,其中包含一个execute()将执行的方法,并根据“命令 ( command)” 模式调用该方法
/*the Command interface*/

public interface Command{
    void execute();
}
有必要封装类技能的执行Light。为此,我们将创建类TurnOnLightCommandTurnOffLightCommand实现接口Command,并将在构造函数中接受类对象Light。并且他们每个人只会执行一个动作。一个将调用该方法turnOn(),另一个将调用turnOff()
/*the Command for turning on the light*/

public class TurnOnLightCommand implements Command{
   private Light theLight;

   public TurnOnLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOn();
   }
}

/*the Command for turning off the light*/

public class TurnOffLightCommand implements Command{
   private Light theLight;

   public TurnOffLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOff();
   }
}
现在是时候创建一个接受这些封装的对象方法的对象了Light。从模式上来说,它被称为命令调用者(invoker)。让我们调用它Switch并让它接受构造函数中的变量Command,这些变量将在创建的方法flipUp()和中使用flipDown()
/*the Invoker class*/

public class Switch {
    private Command flipUpCommand;
    private Command flipDownCommand;

    public Switch(Command flipUpCommand,Command flipDownCommand){
         this.flipUpCommand=flipUpCommand;
         this.flipDownCommand=flipDownCommand;
    }

    public void flipUp(){
         flipUpCommand.execute();
    }

    public void flipDown(){
         flipDownCommand.execute();
    }
}
当然,我们将创建一个类,使用它们来了解一般情况。它将被称为 main 方法,所有操作都将在其中发生:
/*The test class*/
public class TestCommand{
   public static void main(String[] args){
       // создаем an object, который будет использоваться
       Light l=new Light();
       // создаем an objectы для всех умений an object Light:
       Command switchUp=new TurnOnLightCommand(l);
       Command switchDown=new TurnOffLightCommand(l);

       // Создаемтся invoker, с которым мы будем непосредственно контактировать:
       Switch s=new Switch(switchUp,switchDown);

       // вот проверка этого, используем методы:
       s.flipUp();
       s.flipDown();
   }
}
输出如下:
"The light is on"
"The light is off"

这个应用在哪里呢?

目的很明确需要什么以及为什么需要这样做,即:在需要分离特定执行的情况下,这非常方便。这样某些功能的使用不依赖于具体的实现,并且可以在不损坏系统的情况下进行更改。像这样的东西...)写下你的评论,让我们讨论,也许有些事情可以变得更简单,讲得更好,如果有必要我们会编辑所有内容)这样对于那些第一次阅读的人来说,它会尽可能清晰。好吧,喜欢这篇文章的人就在上面加一个“+”:)这对我来说很重要)随着时间的推移,我想写更多关于BuilderSingleton和其他的内容。 另请参阅我的其他文章:
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION