设计模式——命令模式

命令模式是一个高内聚的模式,将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请
求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
1.Receive接收者角色
该角色就是干活的角色,命令传递到这里是应该被执行的。
2. Command命令角色
需要执行的所有命令都在这里声明。
3. Invoker调用者角色
接收到命令,并执行命令。
示例代码如下:

// 抽象接收者
public abstract class Receiver {

    // 业务逻辑
    public abstract void method();

}

// 具体接收者
public class ConcreteReceiver1 extends Receiver {

    @Override
    public void method() {
        // 具体业务逻辑
    }

}

//具体接收者
public class ConcreteReceiver2 extends Receiver {

    @Override
    public void method() {
        // 具体业务逻辑
    }

}

// 抽象命令类
public abstract class Command {

    // 自身的默认接收者
    protected final Receiver receiver;

    // 设置自己的接收着
    public Command(Receiver receiver){
        this.receiver = receiver;
    }

    // 每个具体的命令都实现一个接收者的业务处理
    public abstract void execute();

}

public class ConcreteCommand1 extends Command {

    // 自身的默认接收者
    public ConcreteCommand1(){
        super(new ConcreteReceiver1());
    }

    // 设置自己的接收着
    public ConcreteCommand1(Receiver receiver) {
        super(receiver);
    }

    @Override
    public void execute() {
        // 每个具体的命令都实现一个接收者的业务处理
        super.receiver.method();
    }

}

public class ConcreteCommand2 extends Command {

    // 自身的默认接收者
    public ConcreteCommand2(){
        super(new ConcreteReceiver1());
    }

    // 设置自己的接收着
    public ConcreteCommand2(Receiver receiver) {
        super(receiver);
    }

    @Override
    public void execute() {
        // 每个具体的命令都实现一个接收者的业务处理
        super.receiver.method();
    }

}

public class Invoker {

    private Command command;

    // 接收命令
    public void setCommand(Command command){
        this.command = command;
    }

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

}

public class Test {

    public static void main(String[] args) {
        // 调用者
        Invoker invoker = new Invoker();
        // 命令者
        Command command1 = new ConcreteCommand1();
        Command command2 = new ConcreteCommand2();

        // 调用者来执行命令
        invoker.setCommand(command1);
        invoker.action();

        // 调用者来执行命令
        invoker.setCommand(command2);
        invoker.action();
    }

}

调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用 Command 抽象类的 execute 方法就可以,不需要了解到底是哪个接收者执行。Command 的子类可以非常容易地扩展,而调用者 Invoker 和高层次的模块不产生严重的代码耦合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值