命令模式如何使发送者与接收者脱钩?

命令模式如何使发送者与接收者脱钩?,第1张

命令模式如何使发送者与接收者脱钩?

您可以想到以下命令模式工作流程。

  1. Command
    声明所有命令的接口,并提供一个简单的execute()方法,该方法要求命令Receiver进行 *** 作。

  2. Receiver
    有怎样做才能执行请求的知识。

  3. Invoker
    持有命令可以得到
    Command
    通过调用execute方法来执行请求。

  4. Client
    创建
    ConcreteCommands
    并设置
    Receiver
    该命令。

  5. ConcreteCommand
    限定的动作和所述接收器之间的结合。

  6. 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”。现在查看代码。

  1. Invoker simply executes the ConcreteCommand
    (在这种情况下为OnCommand)通过传递ConcreteReceiver。
  2. ConcreteCommand executes Command
    通过ConcreteReceiver即
    ConcreteCommand defines binding between Action and Receiver.
  3. 如果看到工作流程,Invoker不会更改其他命令,并且可以在
    execute()
    Invoker方法中添加业务逻辑,例如java.lang.Thread,如下所述。
  4. 就这样
    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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5490330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存