您可以想到以下命令模式工作流程。
Command
声明所有命令的接口,并提供一个简单的execute()方法,该方法要求命令Receiver进行 *** 作。该
Receiver
有怎样做才能执行请求的知识。该
Invoker
持有命令可以得到Command
通过调用execute方法来执行请求。在
Client
创建ConcreteCommands
并设置Receiver
该命令。的
ConcreteCommand
限定的动作和所述接收器之间的结合。当
Invoker
调用执行ConcreteCommand
将运行在接收一个或多个动作。
查看示例代码以更好地理解事物。
public class CommandDemoEx{ public static void main(String args[]){ // On command for TV with same invoker Receiver r = new TV(); Command onCommand = new onCommand(r); Invoker invoker = new Invoker(onCommand); invoker.execute(); // On command for DVDPlayer with same invoker r = new DVDPlayer(); onCommand = new onCommand(r); invoker = new Invoker(onCommand); invoker.execute(); }}interface Command { public void execute();}class Receiver { public void switchOn(){ System.out.println("Switch on from:"+this.getClass().getSimpleName()); }}class onCommand implements Command{ private Receiver receiver; public onCommand(Receiver receiver){ this.receiver = receiver; } public void execute(){ receiver.switchOn(); }}class Invoker { public Command command; public Invoker(Command c){ this.command=c; } public void execute(){ this.command.execute(); }}class TV extends Receiver{ public TV(){ } public String toString(){ return this.getClass().getSimpleName(); }}class DVDPlayer extends Receiver{ public DVDPlayer(){ } public String toString(){ return this.getClass().getSimpleName(); }}
输出:
java CommandDemoExSwitch on from:TVSwitch on from:DVDPlayer
要回答您的问题:
我已经阅读了客户对具体接收方和具体命令的了解,通常是客户在具体命令对象中设置接收方对象。那为什么说它使发送者和接收者分离
为了使单词标准化,请用“ invoker”替换“ sender”。现在查看代码。
Invoker simply executes the ConcreteCommand
(在这种情况下为OnCommand)通过传递ConcreteReceiver。ConcreteCommand executes Command
通过ConcreteReceiver即ConcreteCommand defines binding between Action and Receiver.
- 如果看到工作流程,Invoker不会更改其他命令,并且可以在
execute()
Invoker方法中添加业务逻辑,例如java.lang.Thread,如下所述。 - 就这样
Client (sender) and Receiver are loosely couple through Invoker, which has knowledge of what command to be executed
。
__此
链接中的
线程示例
您可以通过实现Runnable对象来创建线程。
Thread t = new Thread (new MyRunnable()).start();
=>
Invoker invoker = new Invoker(new ConcreteCommand()); invoker.start()
并且在start()中有逻辑可以调用上述情况下的run()的ConcreteCommand.execute()。
start()方法将在Thread中调用run()方法。 如果直接直接调用run()方法会怎样?它不会被视为线程。
像该线程的start()方法一样,您可以在Invoker中添加一些业务逻辑。
public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); start0(); if (stopBeforeStart) { stop0(throwableFromStop); } }private native void start0(); // Native pre is not here but this method will call run() methodpublic void run() { if (target != null) { target.run(); }}
编辑:
关于您的最后一个查询
在这里我们创建命令对象,接收者对象和调用者对象,然后在命令对象中传递接收者对象,然后在调用者对象中传递命令对象。就像我们在这里为电视和DVDPlayer所做的那样,我们为每个接收器执行此 *** 作。同样在方法“主要”中,TV和DVDPlayer的对象是已知的,实际上是创建的。我们可以简单地执行tvObject.switchOn()和dvdPlayer.switchOn()。命令模式有何帮助
客户不必担心
Receiver班级变化。
Invoker直接在
ConcreteCommand具有
Receiver对象的上工作。
Receiver对象将来可能会从
siwtchOn()更改为
switchOnDevice()。但是客户端交互不会改变。
如果您有两个不同的命令,例如
switchOn()和
switchOff(),则仍然可以使用相同的命令
Invoker。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)