设计模式 十七、命令模式

本文介绍命令模式的基本概念,包括其在软件设计中的应用优势,并通过一个简单的示例代码演示了命令模式的具体实现方式。

命令模式 Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化,对请求队列或记录请求日志,以及支持可测性的操作。

命令模式
第一、能够容易设计一个命令队列;
第二、在需要的情况下,可以较容易地将命令融入日志;
第三、允许接受请求的一方决定是否要否决请求;
第四、可以容易地实现对请求的撤销和重做;
第五、由于新加进来的具体命令类不影响其他的类,因此增加新的具体命令类很容易

命令模式把请求一个操作的对象与知道怎样执行一个操作的对象分隔开。

//命令类,用来声明执行操作的接口
abstract public class Command {
    protected Receiver receiver;
    protected String string;

    public Command(Receiver receiver,String string) {
        this.receiver = receiver;
        this.string = string;
    }

    abstract public void Execute(String string);
}


//任何类都可以作为一个接收者,知道如何实施与执行一个与请求相关的操作
public class Receiver {
    public void Action(String string) {
        System.out.println("执行请求" + string);
    }
}

//具体命令类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute
public class ConcreteCommand extends Command {
    public ConcreteCommand(Receiver receiver, String string) {
        super(receiver, string);
    }

    @Override
    public void Execute(String string) {
        receiver.Action(string);
    }
}

//请求者类,要求该命令执行请求
public class Invoker {
    private ArrayList<Command> list = new ArrayList<>();

    public void SetCommand(Command command) {
        list.add(command);
    }

    public void CancelCommand(Command command) {
        list.remove(command);
    }

    public void ExecuteCommand() {
        for (Command command : list) {
            command.Execute(command.string);
        }
    }

    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command commandA = new ConcreteCommand(receiver, "A命令");
        Command commandB = new ConcreteCommand(receiver, "B命令");
        Invoker invoker = new Invoker();

        invoker.SetCommand(commandA);
        invoker.SetCommand(commandB);
        invoker.ExecuteCommand();

        invoker.CancelCommand(commandB);
        invoker.ExecuteCommand();
    }
}

输出:

执行请求A命令
执行请求B命令
执行请求A命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值