【Javaデザインパターン】Javaデザインパターン(6)コマンドパターン(コマンドパターン)

この記事の内容

1.コマンドモードの概要

2、コードの実装

2.1一般的なクラス図

2.2コードの実装


コマンドパターン(コマンドパターン)は、動作パターンであるデータ駆動型のデザインパターンです。リクエストはコマンドの形式でオブジェクトにラップされ、呼び出し元のオブジェクトに渡されます。呼び出し元のオブジェクトは、コマンドを処理できる適切なオブジェクトを探し、コマンドを対応するオブジェクトに渡します。対応するオブジェクトは、コマンドを実行します。

1.コマンドモードの概要

インテント:リクエストをオブジェクトにカプセル化して、さまざまなリクエストで顧客をパラメータ化できるようにします。

主な解決策:ソフトウェアシステムでは、通常、動作要求者と動作実装者は緊密に結合された関係にありますが、動作を記録、キャンセル、またはやり直す必要があり、トランザクションが処理される場合など、これができない場合があります。抵抗力のある密結合設計の変更は適していません。

使用する場合:「記録、元に戻す/やり直し、トランザクション」やその他の動作処理などの状況では、変更に抵抗できないこの種の緊密な結合は不適切です。この場合、「ビヘイビアリクエスター」を「ビヘイビア実装者」から切り離す方法は?オブジェクトとして一連の動作を抽象化すると、2つの間の疎結合を実現できます。

解決方法:受信者を呼び出して、発信者を介してコマンドを実行します。順序は、発信者→コマンド→受信者です。

キーコード:3つの役割を定義します:1。実際のコマンド実行オブジェクトを受信しました2.コマンド3.呼び出し元はコマンドオブジェクトのエントリを使用します

アプリケーション例:Struts 1にはアクションコアコントローラーActionServletが1つだけあり、これはInvokerと同等であり、モデルレイヤークラスには、特定のコマンドと同等のさまざまなアプリケーションを持つさまざまなモデルクラスがあります。

利点:1。システム結合の程度を減らします。2.新しいコマンドをシステムに簡単に追加できます。

短所:コマンドモードを使用すると、一部のシステムで特定のコマンドクラスが多すぎる可能性があります。

使用シナリオ:コマンドモードは、次のようにコマンドと見なされる場所であればどこでも使用できます。1.GUIの各ボタンはコマンドです。2.CMDをシミュレートします。

注:システムは、コマンドの元に戻す(元に戻す)操作とやり直し操作をサポートする必要があります。コマンドモードの使用を検討することもできます。コマンドモード拡張機能を参照してください。

2、コードの実装

すべてのデザインパターンのコード実装例は、Code Cloudで表示できます。興味がある場合は、確認できます。CodeCloudアドレス:https//gitee.com/no8g/java-design-patterns

2.1一般的なクラス図

このクラス図には、次の3つの役割があります。

受信者の役割:これは作業の役割です。コマンドは、コマンドに渡されたときに実行する必要があります。具体的には、上記の例では、Groupの3つの実装クラスがあります。

コマンドの役割:これはコマンドです。私が実行する必要のあるすべてのコマンドはここで宣言されています。

呼び出し元の役割:呼び出し元、コマンドを受信し、コマンドを実行します。この例では、私のプロジェクトマネージャーがこの役割です。

コマンドモードは比較的単純ですが、プロジェクトで非常に頻繁に使用され、リクエスター(Invoker)をエグゼキューター(Receiver)から分離し、スケーラビリティも十分に保証されているため、カプセル化は非常に優れています。ただし、コマンドモードにも欠点があります。コマンドのサブクラスがないかどうかを確認できます。数十個ではなく数十個を書き留めたい場合、このタイプの拡張は非常に多く、プロジェクトの全員が必要になります。それを使用することを検討してください。

2.2コードの実装

package com.iot.practice.designpattern.command.commandpattern;

/**
 * <p>CommandClient 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:45</p>
 * <p>@remark:</p>
 */
public class CommandClient {

    public static void main(String[] args) {
        // 定义我们的接头人
        Invoker zhangSan = new Invoker();

        // 客户要求增加一项需求
        System.out.println("\n-------------客户要求增加一项需求-----------------");

        // 客户给我们下命令来
        Command command = new AddRequirementCommand();

        // 接头人接收到命令
        zhangSan.setCommand(command);

        // 接头人执行命令
        zhangSan.action();


        // 客户要求增加一项需求
        System.out.println("\n-------------客户要求删除一个页面-----------------");
        // 客户给我们下命令来
        Command command1 = new DeletePageCommand();

        //接头人接收到命令
        zhangSan.setCommand(command1);

        //接头人执行命令
        zhangSan.action();
    }
}
package com.iot.practice.designpattern.command.commandpattern;

import com.iot.practice.designpattern.command.CodeGroup;
import com.iot.practice.designpattern.command.PageGroup;
import com.iot.practice.designpattern.command.RequirementGroup;

/**
 * <p>Command 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:34</p>
 * <p>@remark:命令的抽象类,我们把客户发出的命令定义成一个一个的对象</p>
 */
public abstract class Command {

    /**
     * 把三个组都定义好,子类可以直接使用
     *
     * 需求组
     */
    protected RequirementGroup requirementGroup = new RequirementGroup();

    /**
     * 美工组
     */
    protected PageGroup pageGroup = new PageGroup();

    /**
     * 代码组
     */
    protected CodeGroup codeGroup = new CodeGroup();

    /**
     * 只要一个方法,你要我做什么事情
     */
    public abstract void execute();
}
package com.iot.practice.designpattern.command.commandpattern;

/**
 * <p>Invoker 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:42</p>
 * <p>@remark:接头人的职责就是接收命令,并执行</p>
 */
public class Invoker {

    /**
     * 什么命令
     */
    private Command command;

    /**
     * 客户发出命令
     */
    public void setCommand(Command command) {
        this.command = command;
    }

    /**
     * 执行客户的命令
     */
    public void action() {
        this.command.execute();
    }
}
package com.iot.practice.designpattern.command.commandpattern;

/**
 * <p>AddRequirementCommand 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:38</p>
 * <p>@remark:增加一项需求</p>
 */
public class AddRequirementCommand extends Command {

    /**
     * 执行增加一项需求的命令
     */
    @Override
    public void execute() {
        // 找到需求组
        super.requirementGroup.find();

        // 增加一份需求
        super.requirementGroup.add();

        // 给出计划
        super.requirementGroup.plan();
    }
}
package com.iot.practice.designpattern.command.commandpattern;

/**
 * <p>DeleltePageCommand 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:41</p>
 * <p>@remark:<删除一个页面的命令/p>
 */
public class DeletePageCommand extends Command {

    /**
     * 执行删除一个页面的命令
     */
    @Override
    public void execute() {
        // 找到页面组
        super.pageGroup.find();
        // 删除一个页面
        super.pageGroup.delete();
        // 给出计划
        super.pageGroup.plan();
    }
}
package com.iot.practice.designpattern.command;

/**
 * <p>Group 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:11</p>
 * <p>@remark:项目组分成了三个组,每个组还是要接受增删改的命令</p>
 */
public abstract class Group {

    /**
     * 甲乙双方分开办公,你要和那个组讨论,你首先要找到这个组
     */
    public abstract void find();

    /**
     * 被要求增加功能
     */
    public abstract void add();

    /**
     * 被要求删除功能
     */
    public abstract void delete();

    /**
     * 被要求修改功能
     */
    public abstract void change();

    /**
     * 被要求给出所有的变更计划
     */
    public abstract void plan();
}

 

package com.iot.practice.designpattern.command;

/**
 * <p>RequirementGroup 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:14</p>
 * <p>@remark:</p>
 */
public class RequirementGroup extends Group {

    @Override
    public void find() {
        System.out.println("找到需求组...");
    }

    @Override
    public void add() {
        System.out.println("客户要求增加一项需求...");
    }

    @Override
    public void delete() {
        System.out.println("客户要求删除一项需求...");
    }

    @Override
    public void change() {
        System.out.println("客户要求修改一项需求...");
    }

    @Override
    public void plan() {
        System.out.println("客户要求需求变更计划...");
    }
}
package com.iot.practice.designpattern.command;

/**
 * <p>PageGroup 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:23</p>
 * <p>@remark:美工组的职责是设计出一套漂亮、简单、便捷的界面</p>
 */
public class PageGroup extends Group {

    @Override
    public void find() {
        System.out.println("找到美工组...");
    }

    @Override
    public void add() {
        System.out.println("客户要求增加一个页面...");
    }

    @Override
    public void delete() {
        System.out.println("客户要求删除一个页面...");
    }

    @Override
    public void change() {
        System.out.println("客户要求修改一个页面...");
    }

    @Override
    public void plan() {
        System.out.println("客户要求页面变更计划...");
    }
}
package com.iot.practice.designpattern.command;

/**
 * <p>CodeGroup 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 15:27</p>
 * <p>@remark:代码组的职责是实现业务逻辑,当然包括数据库设计了</p>
 */
public class CodeGroup extends Group {

    @Override
    public void find() {
        System.out.println("找到代码组...");
    }

    @Override
    public void add() {
        System.out.println("客户要求增加一项功能...");
    }

    @Override
    public void delete() {
        System.out.println("客户要求删除一项功能...");
    }

    @Override
    public void change() {
        System.out.println("客户要求修改一项功能...");
    }

    @Override
    public void plan() {
        System.out.println("客户要求代码变更计划...");
    }
}

 

 

終わり!

おすすめ

転載: blog.csdn.net/weixin_44299027/article/details/113888194