设计模式之命令模式

1.命令模式概念

        将请求封装为对象,从而使你能够将请求参数化、延迟请求的执行或将请求放入队列中。命令模式可以将请求发送者与请求接收者解耦,使它们之间不需要直接交互。

2.命令模式的基本概念

1)Command(命令接口)

        定义了一个执行命令的接口,通常包含一个 execute 方法。

2)ConcreteCommand(具体命令)

        实现了 Command 接口,负责设置接收者,并调用接收者的相应方法来完成请求。

3)Receiver(接收者)

        执行与请求相关的操作。

4)Invoker(调用者)

        请求发送者,负责调用命令对象的 execute 方法。

5)Client(客户端)

        创建具体命令对象,并将其传递给调用者。

3.举个栗子:

以封装不同角色的指令请求为例

不同角色指令 ===》封装 ===》封装角色指令集合==》角色指令执行者===》执行封装角色指令

注:如果使用前后端的请求来解释,比较合适,前端的请求 是封装过的命令,使用消息队列rabbitMq收集前端的请求,然后通过rabbitMq转发给后端,后端接受到请求,就会执行响应的操作。

4.代码实现

1)命令接口代码实现

package org.xiji.command;

/**
 * 指令接口
 */
public interface Command {
    /**
     * 第一个技能
     */
    void firstSkill();

    /**
     * 第二个技能
     */
    void secondSkill();

    /**
     * 第三个技能
     */
    void thirdSkill();

    /**
     * 第四个技能
     */
    void fourthSkill();
}

2)ConcreteCommand代码实现

package org.xiji.command;

/**
 * 指令封装
 */
public class GameRoleCommand implements Command{
    /**
     *
     */
    private GameRole gameRole;

    public GameRoleCommand() {
    }

    public GameRoleCommand(GameRole gameRole) {
        this.gameRole = gameRole;
    }

    public GameRole getGameRole() {
        return gameRole;
    }

    public void setGameRole(GameRole gameRole) {
        this.gameRole = gameRole;
    }

    @Override
    public void firstSkill() {
        this.gameRole.firstSkill();

    }

    @Override
    public void secondSkill() {

        this.gameRole.secondSkill();
    }

    @Override
    public void thirdSkill() {
        this.gameRole.thirdSkill();

    }

    @Override
    public void fourthSkill() {
        this.gameRole.fourthSkill();

    }
}

3)Receiver代码实现

package org.xiji.command;

/**
 * 游戏角色
 */
public class GameRole {
    /**
     * 角色名字
     */
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public GameRole() {
    }

    public GameRole(String name) {
        this.name = name;
    }

    /**
     * 第一个技能
     */
    public void firstSkill() {

        System.out.println(this.name+"扔出冰川地雷");
    }
    /**
     * 第二个技能
     */
    public void secondSkill() {

        System.out.println(this.name+"向前挥剑");

    }
    /**
     * 第三个技能
     */
    public void thirdSkill() {

        System.out.println(this.name+"使用滞空无限连");
    }
    /**
     * 第四个技能
     */
    public void fourthSkill() {

        System.out.println(this.name+"使用破刃");
    }
}

4)Invoker代码实现

package org.xiji.command;

/**
 * 游戏指令使用
 */
public class GameRoleInvoker {
    Command command;

    //构造

    public GameRoleInvoker(Command command) {
        this.command = command;
    }

    public GameRoleInvoker() {
    }

    public Command getCommand() {
        return command;
    }

    public void setCommand(Command command) {
        this.command = command;
    }


    //指定指令操作
    public void firstSkill(){
        command.firstSkill();
    }
    public void secondSkill(){
        command.secondSkill();
    }
    public void thirdSkill(){
        command.thirdSkill();
    }
    public void fourthSkill(){
        command.fourthSkill();
    }
}

5)Client代码实现

package org.xiji.command;

import java.util.ArrayList;
import java.util.List;

/**
 *  命令模式
 */
public class CommandMain {
    public static void main(String[] args) {

        //创建角色
        GameRole zhangsan = new GameRole("张三");
        GameRole lisi = new GameRole("李四");
        GameRole xiaojiu = new GameRole("小久");
        GameRole xiji = new GameRole("惜己");

        //封装角色指令
        GameRoleCommand zhangsanCommand = new GameRoleCommand(zhangsan);
        GameRoleCommand lisiCommand = new GameRoleCommand(lisi);
        GameRoleCommand xiaojiuCommand = new GameRoleCommand(xiaojiu);
        GameRoleCommand xijiCommand = new GameRoleCommand(xiji);

        //创建指令队列
        ArrayList<GameRoleCommand> gameRoleCommandMQ = new ArrayList<>();
        gameRoleCommandMQ.add(zhangsanCommand);
        gameRoleCommandMQ.add(lisiCommand);
        gameRoleCommandMQ.add(xiaojiuCommand);
        gameRoleCommandMQ.add(xijiCommand);

        //执行角色指令队列

        for (int i = 0; i < gameRoleCommandMQ.size(); i++) {
            System.out.println("================================================================");
            System.out.println("总共"+gameRoleCommandMQ.size()+"指令."+"现在执行"+(i+1)+"指令");
            //使用指令,指令的执行模式
            gameRoleCommandMQ.get(i).firstSkill();
            gameRoleCommandMQ.get(i).secondSkill();
            gameRoleCommandMQ.get(i).thirdSkill();
            gameRoleCommandMQ.get(i).fourthSkill();
            System.out.println("================================================================");
        }


    }
}

6)执行结果如下

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使得请求的发送者和接收者解耦。在命令模式中,请求以命令的形式包裹在对象中,并传递给调用对象。调用对象寻找可以处理该命令的合适的对象,并将命令传递给相应的对象,该对象执行命令。 在C语言中,可以使用函数指针来实现命令模式。具体步骤如下: 1. 定义一个命令接口,该接口包含一个执行命令的方法。 2. 创建具体的命令类,实现命令接口,并在执行方法中调用相应的函数。 3. 创建一个调用者类,该类包含一个命令对象,并提供一个执行命令的方法。 4. 在调用者类中,将命令对象传递给相应的对象,并调用命令对象的执行方法。 下面是一个简单的示例代码: ```c #include <stdio.h> // 定义命令接口 typedef struct { void (*execute)(void); } Command; // 创建具体的命令类 typedef struct { Command command; void (*function)(void); } ConcreteCommand; void concreteCommand_execute(void) { printf("执行具体的命令\n"); } // 创建调用者类 typedef struct { Command *command; void (*setCommand)(Command *command); void (*executeCommand)(void); } Invoker; void invoker_setCommand(Command *command) { Invoker *invoker = (Invoker *)command; invoker->command = command;} void invoker_executeCommand(void) { Invoker *invoker = (Invoker *)invoker->command; invoker->command->execute(); } int main() { // 创建具体的命令对象 ConcreteCommand concreteCommand; concreteCommand.command.execute = concreteCommand_execute; concreteCommand.function = concreteCommand_execute; // 创建调用者对象 Invoker invoker; invoker.setCommand((Command *)&concreteCommand); invoker.executeCommand(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值