设计模式------命令模式

命令模式定义

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

 

Receive接收者角色

该角色就是干活的角色,命令传递到这里是应该被执行的。

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

Command命令角色

需要执行的所有命令都在这里声明。

public abstract class Command{
    //每个命令都必须有一个执行命令的方法
    public abstract void execute();
}

具体的Command类

public class ConcreteCommand1 extends Command{
    //对哪个Receiver类进行命令处理
    private Receiver receiver;

    //构造函数传递接收者
    public ConcreteCommand1(Receiver receiver){
        this.receiver = receiver;
    }

    //必须实现一个命令
    public void execute(){
        //业务处理
        this.receiver.doSomething();
    }
}

Invoker调用者角色

接收到命令,并执行命令。

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

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

命令模式的优点:

类间的解耦,可扩展性

缺点:

命令很多时,Command的子类变多,类变得复杂。

 

命令模式扩充

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 ConcreteCommand1());
    }

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

    //每个具体的命令都必须实现一个命令
    public void execute(){
        //业务处理
        super.receiver.doSomething();
    }
}

每个命令完成单一的职责,而不是根据接收者的不同完成不同的职责。在高层模块的调用时就不用考虑接收者是谁的问题。

posted @ 2017-08-16 21:38  Topze  阅读(93)  评论(0编辑  收藏  举报