[자바 디자인 패턴] 자바 디자인 패턴 (6) 명령 패턴 (명령 패턴)

이 기사의 내용

1. 명령 모드 소개

둘째, 코드 구현

2.1 일반 클래스 다이어그램

2.2 코드 구현


명령 패턴 (명령 패턴)은 동작 패턴 인 데이터 기반 디자인 패턴입니다. 요청은 명령 형식으로 개체에 래핑되어 호출 개체에 전달됩니다. 호출 개체는 명령을 처리 할 수있는 적절한 개체를 찾고 명령을 실행하는 해당 개체에 명령을 전달합니다.

1. 명령 모드 소개

의도 : 요청을 객체로 캡슐화하여 다양한 요청으로 고객을 매개 변수화 할 수 있습니다.

주요 솔루션 : 소프트웨어 시스템에서 동작 요청자와 동작 구현자는 일반적으로 밀접하게 결합 된 관계에 있지만 동작을 기록, 취소 또는 다시 실행해야하고 트랜잭션을 처리해야하는 경우와 같이 일부 경우에는이를 수행 할 수 없습니다. 견고하게 결합 된 다양한 디자인은 적합하지 않습니다.

사용시기 : "기록, 실행 취소 / 다시 실행, 트랜잭션"및 기타 동작 처리와 같은 일부 상황에서는 변경에 저항 할 수없는 이러한 종류의 긴밀한 결합이 부적절합니다. 이 경우 "동작 구현 자"에서 "동작 요청자"를 분리하는 방법은 무엇입니까? 일련의 동작을 객체로 추상화하면 둘 사이의 느슨한 결합을 얻을 수 있습니다.

해결 방법 : 수신자를 호출하여 발신자를 통해 명령을 실행합니다. 순서는 caller → command → receiver입니다.

키 코드 : 세 가지 역할 정의 : 1. 실제 명령 실행 개체를 수신했습니다. 2. 명령 3. 호출자가 명령 개체의 항목을 사용합니다.

애플리케이션 예제 : Struts 1에는 Invoker와 동일한 액션 코어 컨트롤러 ActionServlet이 하나만 있으며, 모델 계층 클래스는 특정 Command와 동일한 애플리케이션이 다른 다른 모델 클래스를 갖습니다.

장점 : 1. 시스템 커플 링 정도를 줄입니다. 2. 시스템에 새 명령을 쉽게 추가 할 수 있습니다.

단점 : 명령 모드를 사용하면 일부 시스템에서 특정 명령 클래스가 너무 많이 발생할 수 있습니다.

사용 시나리오 : 다음과 같이 명령으로 간주되는 모든 곳에서 명령 모드를 사용할 수 있습니다. 1. GUI의 각 버튼은 명령입니다. 2. CMD를 시뮬레이션합니다.

참고 : 시스템은 명령의 실행 취소 (실행 취소) 작업과 다시 실행 작업을 지원해야합니다. 명령 모드 사용을 고려할 수도 있습니다. 명령 모드 확장을 참조하십시오.

둘째, 코드 구현

모든 디자인 패턴의 코드 구현 예제는 코드 클라우드에서 볼 수 있으며 관심이 있으시면 확인하실 수 있습니다. 코드 클라우드 주소 : https://gitee.com/no8g/java-design-patterns

2.1 일반 클래스 다이어그램

이 클래스 다이어그램에는 세 가지 역할이 있습니다.

수신자 역할 : 이것은 작업의 역할입니다. 명령은 전달 될 때 실행되어야합니다. 특히 위의 예에서는 Group의 세 가지 구현 클래스가 있습니다.

명령 역할 : 명령입니다. 내가 실행해야하는 모든 명령이 여기에 선언되어 있습니다.

호출자 역할 : 호출자, 명령 수신 및 명령 실행 예제에서 내 프로젝트 관리자는이 역할입니다.

명령 모드는 비교적 간단하지만 프로젝트에서 자주 사용되며 요청자 (Invoker)와 실행자 (Receiver)를 분리하여 캡슐화가 매우 좋고 확장 성도 잘 보장됩니다. 하지만 커맨드 모드에도 단점이 있습니다. Command의 하위 클래스가 없는지 확인할 수 있습니다. 몇 개가 아니라 수십 개를 적고 싶다면 이런 유형의 확장이 매우 많아서 프로젝트에있는 모든 사람이 필요합니다. 그것을 사용하는 것을 고려하십시오.

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