19-命令模式

19-命令模式

概念

命令模式(Command),将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

命令模式作用
第一:能比较容易地设计一个命令队列
第二:在需要的情况下,可以较容易地将命令记入日志
第三:允许接收请求的一方决定是否要否决请求
第四:可以容易地实现对请求的撤销和重做
第五:由于加新的命令不影响其他的类,因此增加新的命令很容易
最关键的一点:命令模式把请求一个操作的对象与怎么执行一个操作的对象分割开

例子

烤肉的例子

package com.gof.command;

/**
 * 功能描述
 *
 * @since 2023-02-28
 */
public abstract class Command {
    protected Barbecuer receiver;

    public Command(Barbecuer receiver) {
        this.receiver = receiver;
    }

    public abstract void executeCommand();
}
package com.gof.command;

/**
 * 功能描述
 *
 * @since 2023-02-28
 */
public class BakeChickenWingCommand extends Command {
    public BakeChickenWingCommand(Barbecuer receiver) {
        super(receiver);
    }

    @Override
    public void executeCommand() {
        receiver.bakeChickenWing();
    }
}
package com.gof.command;

/**
 * 功能描述
 *
 * @since 2023-02-28
 */
public class BakeMuttonCommand extends Command {
    public BakeMuttonCommand(Barbecuer receiver) {
        super(receiver);
    }

    @Override
    public void executeCommand() {
        receiver.bakeMutton();
    }
}
package com.gof.command;

/**
 * 功能描述
 *
 * @since 2023-02-28
 */
public class Barbecuer {
    public void bakeMutton() {
        System.out.println("烤羊肉串!");
    }

    public void bakeChickenWing() {
        System.out.println("烤鸡翅!");
    }
}
package com.gof.command;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 功能描述
 *
 * @since 2023-02-28
 */
public class Waiter {
    private List<Command> commands = new ArrayList<>();

    public void addCommand(Command command) {
        commands.add(command);
        System.out.printf("增加订单:%s, 时间:%s \n", command.toString(), LocalDateTime.now());

    }

    public void cancelCommand(Command command) {
        commands.remove(command);
        System.out.printf("增加订单:%s, 时间:%s\n", command.toString(), LocalDateTime.now());

    }

    public void notifyExecute() {
        for (Command command : commands) {
            command.executeCommand();
        }
    }
}
package com.gof.command;

/**
 * 功能描述
 *
 * @since 2023-02-28
 */
public class Client {
    public static void main(String[] args) {
        // 开业前 烤肉师傅准备,烤羊肉串菜单准备,烤鸡翅菜单准备
        Barbecuer barbecuer = new Barbecuer();
        BakeMuttonCommand muttonCommand = new BakeMuttonCommand(barbecuer);
        BakeChickenWingCommand wingCommand = new BakeChickenWingCommand(barbecuer);

        // 开业后 客人下单,通知执行
        Waiter waiter = new Waiter();
        waiter.addCommand(muttonCommand);
        waiter.addCommand(muttonCommand);
        waiter.addCommand(wingCommand);
        waiter.notifyExecute();

    }
}
posted @ 2023-02-28 15:29  Oh,mydream!  阅读(12)  评论(0编辑  收藏  举报