各位论坛会员大家好!
我已经彻底(在我看来)弄清楚了这个模式
Command
,我想尝试“用我自己的话”来谈论它。
根据维基百科,我们可以发现它的目的是
创建一个发送类和接收类不直接依赖的结构。组织对包含发送者类的类的回调。原则上写得清楚、正确,但这只是理论上的。这个怎么做?这就是问题开始的地方,因为…… 描述不再那么清晰和明显。因此,我想通了,我决定告诉你我是如何理解它的,也许这对某人有用:基于对这个模式的目的的描述,我将把描述与代码结合起来,使它更加清晰,因为 在同一个维基百科中,他们将其概括为多种语言,因此描述与示例分开。该模式中有四个术语,我们暂时认为它们是理所当然的:命令(
command
)、命令接收者(
receiver
)、命令调用者(
invoker
)和客户端(
client
)。我将从同一个维基百科中举一个例子,这是相当可以忍受的。
该任务 是一个可以做两件事的类
Light
:开灯和关灯。就模式而言,它将是“命令接收者(
receiver
)”
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
)” 模式调用该方法
public interface Command{
void execute();
}
有必要封装类技能的执行
Light
。为此,我们将创建类
TurnOnLightCommand
并
TurnOffLightCommand
实现接口
Command
,并将在构造函数中接受类对象
Light
。并且他们每个人只会执行一个动作。一个将调用该方法
turnOn()
,另一个将调用
turnOff()
。
public class TurnOnLightCommand implements Command{
private Light theLight;
public TurnOnLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOn();
}
}
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()
。
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 方法,所有操作都将在其中发生:
public class TestCommand{
public static void main(String[] args){
Light l=new Light();
Command switchUp=new TurnOnLightCommand(l);
Command switchDown=new TurnOffLightCommand(l);
Switch s=new Switch(switchUp,switchDown);
s.flipUp();
s.flipDown();
}
}
输出如下:
"The light is on"
"The light is off"
这个应用在哪里呢?
目的很明确需要什么以及为什么需要这样做,即:在需要分离特定执行的情况下,这非常方便。这样某些功能的使用不依赖于具体的实现,并且可以在不损坏系统的情况下进行更改。像这样的东西...)写下你的评论,让我们讨论,也许有些事情可以变得更简单,讲得更好,如果有必要我们会编辑所有内容)这样对于那些第一次阅读的人来说,它会尽可能清晰。好吧,喜欢这篇文章的人就在上面加一个“+”:)这对我来说很重要)随着时间的推移,我想写更多关于
Builder
、
Singleton
和其他的内容。
另请参阅我的其他文章:
GO TO FULL VERSION