19、命令模式—为请求者和实现者解耦

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


package com.thpin.repository.designpattern;

public class CommandDemo {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command commandA = new ConcreteCommandA(receiver);
        Invoker invoker = new Invoker();
        invoker.setCommand(commandA);
        invoker.executeCommond();
        
        Command commandB = new ConcreteCommandB(receiver);
        invoker.setCommand(commandB);
        invoker.executeCommond();
    }
}

/*
 * 命令接受者
 */
class Receiver {
    public void actionA() {
        System.out.println("执行请求A");
    }
    public void actionB() {
        System.out.println("执行请求B");
    }
}

/*
 * 命令接口
 */
abstract class Command {
    protected Receiver receiver;

    public Command(Receiver receiver) {
        this.receiver = receiver;
    }
    
    public abstract void execute();
    
}

/*
 * 命令A
 */
class ConcreteCommandA extends Command {
    public ConcreteCommandA(Receiver receiver) {
        super(receiver);
    }

    public void execute() {
        receiver.actionA();
    }
}

/*
 * 命令B
 */
class ConcreteCommandB extends Command {
    public ConcreteCommandB(Receiver receiver) {
        super(receiver);
    }

    public void execute() {
        receiver.actionB();
    }
}

/*
 * 命令调用者
 */
class Invoker {
    private Command command;
    public void executeCommond() {
        command.execute();
    }
    public Command getCommand() {
        return command;
    }

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

结果:

执行请求A

执行请求B

命令模式可以较容易地设计一个命令队列或日志,允许接收请求方决定是否要否决请求,也可以容易地实现请求方对请求撤销或重新请求,很容易加入新的命令因为新的具体命令类不影响其他类。命令模式把请求操作一个操作的对象和知道如何执行这一操作的对象分隔开。

有时候撤销/恢复操作并不需要,这时我们是否需要完整的实现命令模式呢?敏捷开发原则告诉我们,不要为代码添加猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要急着去实现它,事实上,在需要重构的时候通过重构实现命令模式并不难,只有真正需要如撤销/恢复操作等功能时,把原来的代码重构成命令模式才有意义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值