《设计模式》之十:命令模式

Command pattern 命令模式定义:

Encapsulate a request as an object, thereby letting you parameterize cients with different requests, queue or log requests, and support undoable operations.

将请求封装成一个对象,从而让你使用不同的请求把客户端参数化、请求排队或者记录请求日志。还可以提供命令的撤销和恢复功能。

 

命令模式的通用模板:

具体执行方Receiver

public abstract class Receiver {
    // 抽象接受者,定义每个接受者都必须完成的业务
    public abstract void doSomething();
}

Receiver 两个实现类:

public class ConcreteReceiver1 extends Receiver {
    @Override
    public void doSomething() {

    }
}

 

public class ConcreteReceiver2 extends Receiver {
    @Override
    public void doSomething() {

    }
}

 然后是命令抽象类Command

public abstract class Command {
    // 定义一个子类的全局共享变量
    protected final Receiver receiver;
    // 实现类必须定义一个接受者
    public Command(Receiver _receiver) {
        this.receiver = _receiver;
    }
    // 每个命令都必须有一个执行命令的方法
    public abstract void execute();
    // 支持撤销请求
    public abstract void rollback();
}

 两个命令实现类:

public class ConcreteCommand1 extends Command {
    // 声明自己的默认的接受者
    public ConcreteCommand1() {
        super(new ConcreteReceiver1());
    }

    // 设置新的接受者
    public ConcreteCommand1(Receiver _receiver) {
        super(_receiver);
    }

    @Override
    public void execute() {
        super.receiver.doSomething();
    }
    @Override
    public void rollback() {
        System.out.println("根据命令日志撤销");
    }
}

 

public class ConcreteCommand12 extends Command {
    // 声明自己的默认的接受者
    public ConcreteCommand12() {
        super(new ConcreteReceiver1());
    }

    // 设置新的接受者
    public ConcreteCommand12(Receiver _receiver) {
        super(_receiver);
    }

    @Override
    public void execute() {
        super.receiver.doSomething();
    }
    @Override
    public void rollback() {
        System.out.println("根据命令日志撤销");
    }
}

 最后是请求方Invoker类,跟客户端打交道的唯一的类:

public class Invoker {
    private Command command;

    // 受气包,所有命令都得接受
    public void setCommand(Command _command) {
        this.command = _command;
    }
    // 执行命令
    public void action() {
        this.command.execute();
    }
}

 客户端调用演示:

public class Client {
    public static void main(String[] args) {
        // 首先声明调用者Invoker
        Invoker invoker = new Invoker();
        // 定义一个发送给接受者的命令
        Command command = new ConcreteCommand1();
        // 把命令交给调用者去执行
        invoker.setCommand(command);
        invoker.action();
    }
}

 

命令模式优点:

1,类间解耦

调用者角色和接受者角色之间没有任何依赖关系,调用者实现功能时只需要调用Command抽象类的execute方法就可以了,不需要了解到底哪个接受者执行。

2,可扩展性

Command子类可以非常容易的扩展,而调用者Invoker和高层次模块Client不产生严重的代码耦合

3,命令模式结合其他模式更优秀

命令模式可以结合责任链模式,实现命令族解析任务;

结合模板方法模式,则可以减少Command子类膨胀问题

 

命令模式缺点:

如果有N个命令,那么Command子类就必须有N个

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值