デザインモード9のコマンドモード

開発では、メソッド要求とメソッド実行の間に緊密な結合が存在することが多く、これはシステムのメンテナンスに役立ちません。コマンドモードはこの問題を解決するように見えました。

コマンドモードとは

「「

コマンドモードは非常にまとまりのあるモードであり、次のように定義されます。リクエストをオブジェクトとしてカプセル化し、さまざまなリクエストでクライアントをパラメータ化し、リクエストをキューまたはログに記録し、元に戻せない操作をサポートできるようにします(リクエストをオブジェクトとしてカプセル化することにより、さまざまな要求を使用して、クライアントをパラメーター化し、要求をキューに入れたり、要求ログを記録したり、コマンドのキャンセルおよび回復機能を提供したりできます。)

以下は、コマンドモードの一般的なクラス図です。

コマンドモード

コマンドモードは主に3つの要素で構成されています。

「「
  • 受信者の受信:コマンドの受信

  • コマンドの役割:実行するコマンドをカプセル化します

  • 呼び出し元:コマンドの実行

コード

最初に抽象的なレシーバーを作成しますReceiver

public abstract class Receiver {
    //抽象接收者,定义每个接收者都必须完成的业务
    public abstract void doSomething();
}

別のReceiver実装クラスを作成しますConcreteReceiver1それらの作成など、複数の実装クラスが存在する可能性がありますConcreteReceiver2

public class ConcreteReceiver1 extends Receiver {
    @Override
    public void doSomething() {
        Console.log("执行ConcreteReceiver1的方法...");
    }
}

public class ConcreteReceiver2 extends Receiver {
    @Override
    public void doSomething() {
        Console.log("执行ConcreteReceiver2的方法...");
    }
}

次に、コマンド抽象化を作成しますCommand

public abstract class Command {
    //每个命令类都必须有一个执行命令的方法
    public abstract void execute();
}

同様にReceiverCommand多くの実装クラスが存在する可能性があります。

public class ConcreteCommand1 extends Command {
    //对哪个Receiver类进行命令处理
    private Receiver receiver;

    //构造函数传递接收者
    public ConcreteCommand1(Receiver _receiver) {
        this.receiver = _receiver;
    }

    //必须实现一个命令
    @Override
    public void execute() {
        //业务处理
        this.receiver.doSomething();
    }
}
public class ConcreteCommand2 extends Command {
    //对哪个Receiver类进行命令处理
    private Receiver receiver;

    //构造函数传递接收者
    public ConcreteCommand2(Receiver _receiver) {
        this.receiver = _receiver;
    }

    //必须实现一个命令
    @Override
    public void execute() {
        //业务处理
        this.receiver.doSomething();
    }
}

発信者を作成するInvoker

public class Invoker {
    private Command command;

    //接受命令
    public void setCommand(Command _command) {
        this.command = _command;
    }

    //执行命令
    public void action() {
        this.command.execute();
    }
}

テスト:

@Test
public void test() {
    //首先声明调用者Invoker
    Invoker invoker = new Invoker();
    //定义接收者
    Receiver receiver = new ConcreteReceiver1();
    //定义一个发送给接收者的命令
    Command command = new ConcreteCommand1(receiver);
    //把命令交给调用者去执行
    invoker.setCommand(command);
    invoker.action();
}

試験結果:

执行ConcreteReceiver1的方法...

ここReceiverでの方法は、使用する必要のある方法です。この方法は、Command取得によってカプセル化されInvoker実行されます。

コマンドモードについて考える

呼び出し側は、直接受信者のメソッドを呼び出すことはありませんが、呼び出すためCommandexecute()発信者の場合、受信者が誰であるかを知る必要はありません。

一般的に、他の設計モードと組み合わせたコマンドモードの方が良い結果が得られます。

ただし、コマンドモードでは、コマンドを無限に拡張することはできません。コマンドがN個ある場合、コマンドサブクラスがN個あるため、あまり良くありません。

過去に推奨

QRコードをスキャンして、よりエキサイティングになります。または、WeChatLvshen_9を検索すると、返信してバックグラウンドで情報を取得できます

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

もう1つ:[マイベネフィット]をクリックして、さらに驚きを持ってください。

おすすめ

転載: blog.csdn.net/wujialv/article/details/109153859