软件设计模式——命令模式(Command Pattern)

定义与结构

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。《设计模式》中命令模式的定义为:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整的角度来考虑司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用依赖于其他人。只要做好自己的事情就行。司令员要的是结果,不去关注到底士兵是怎么完成任务的。

看下命令模式是有哪些角色来组成的吧
1) 命令角色(Command):声明执行操作的接口。有java 接口或者抽象类来实现。
2) 具体命令角色(Concrete Command):将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现命令角色声明的执行操作的接口。
3) 客户角色(Client):创建一个具体命令对象(并可以设定它的接收者)。
4) 请求者角色(Invoker):调用命令对象执行这个请求。
5) 接收者角色(Receiver):知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。

这里给出一个类图:
这里写图片描述

命令模式的实现

//命令角色——Command
public interface Command {
    public void execute();
}
//接收者角色——Receive
public class Computer {
    public void shutDown()
    {
        System.out.println("computer is shut down");
    }
    public void restart()
    {
        System.out.println("computer is restarted");
    }
}
//具体命令角色————ConcreteCommand2
//关闭电脑
public class ShutDownCommmand implements Command{
    private Computer computer;
    public ShutDownCommmand(Computer computer) {
        this.computer = computer;
    }
    @Override
    public void execute() {
        computer.shutDown();
    }
}
//具体命令角色————ConcreteCommand1
//重启电脑
public class RestartCommand implements Command{
    private Computer computer;
    public RestartCommand(Computer computer) {
        this.computer = computer;
    }
    @Override
    public void execute() {
        computer.restart();
    }
}
//请求者角色——Invoker
public class Switch {
    private List<Command>history = new ArrayList<Command>();
    public Switch(){}
    public void storeAndExecute(Command command)
    {
        this.history.add(command);
        command.execute();
    }
}
//客户角色————Client
public class TestCommand {
    public static void main(String[] args)
    {
        Computer computer = new Computer();
        Command shutdown = new ShutDownCommmand(computer);
        Command restart = new RestartCommand(computer);
        Switch switch1 = new Switch();
        switch1.storeAndExecute(shutdown);
        switch1.storeAndExecute(restart);
    }
}

输出:
computer is shut down
computer is restarted

总结

使用命令模式不仅仅可以解除请求者和接收者之间的耦合,而且可以用来做批处理操作,这完全可以发挥你自己的想象——请求者发出的请求到达命令角色这里以后,先保存在一个列表中而不执行(Switch 中的List history );等到一定的业务需要时,命令模式再将列表中全部的操作逐一执行。

由上面的讲解可以看出命令模式有以下优点:
1) 命令模式将调用操作的请求对象与知道如何实现该操作的接收对象解耦。
2) 具体命令角色可以被不同的请求者角色重用。
3) 你可将多个命令装配成一个复合命令。
4) 增加新的具体命令角色很容易,因为这无需改变已有的类。

转载自:http://blog.csdn.net/wangyanguiyiyang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值