命令模式

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

我们先来看一下命令模式的一般类图
这里写图片描述

在该类图中,我们可以看到三个角色,
1. Receiver接受者角色,该角色就是落实到最后代码实际执行了部分
2. Command命令角色,这是命令模式的核心类,我们通过扩展该类来实现多个命令的解耦。把请求方(Invoker)和执行方(Receiver)分开
3. Invoker调用者角色,接收到命令,并执行命令。一般充当中间的调和的角色,与我们实际生活中项目经理的角色类似

然后我们来大致讲一下命令模式,所谓命令模式,举个例子,就像是甲方乙方再加上个中介,甲方命令乙方做什么事,而不用细分到乙方的部门之下具体的操作。甲方告诉中介命令乙方做的事情,然后中介就规划如何运作,并领导乙方各个部门协调完成。

好了,说了这么多,我们还是来看一看命令模式的通用源码吧。

1.通用Receiver类

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

2.具体的Receiver类

public class ConcreteReciver1 extends Receiver{

    //每个接受者都必须处理一定的业务逻辑
    public void doSomething(){

    }
}

public class ConcreteReciver2 extends Receiver{

    //每个接受者都必须处理一定的业务逻辑
    public void doSomething(){

    }
}

3.抽象的command类

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

4.具体的Command类

public class ConcreteCommand1 extends Command {
    //声明自己的默认接收者
    public ConcreteCommand1(){
        super(new ConcreteReciver1());
    }   
    //设置新的接收者
    public ConcreteCommand1(Receiver _receiver){
        super(_receiver);
    }   
    //每个具体的命令都必须实现一个命令
    public void execute() {
        //业务处理
        super.receiver.doSomething();
    }
}

public class ConcreteCommand2 extends Command { 
    //声明自己的默认接收者
    public ConcreteCommand2(){
        super(new ConcreteReciver2());
    }   
    //设置新的接收者
    public ConcreteCommand2(Receiver _receiver){
        super(_receiver);
    }   
    //每个具体的命令都必须实现一个命令
    public void execute() {
        //业务处理
        super.receiver.doSomething();
    }
}

5.调用者Invoker类

public class Invoker {
    private Command command;
    //受气包,接受命令
    public void setCommand(Command _command){
        this.command = _command;
    }

    //执行命令
    public void action(){
        this.command.execute();
    }

}

6.场景类

public class Client {
    private static Invoker invoker;
    private static Command command;

    public static void main(String[] args) {
        //首先声明出调用者Invoker
        invoker = new Invoker();

        //定义一个发送给接收者的命令
        command = new ConcreteCommand1();

        //把命令交给调用者去执行
        invoker.setCommand(command);
        invoker.action();

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值