重学java23种设计模式(14)命令模式

跟着《软件秘笈---设计模式那点事》学习


定义:

命令模式(Command Pattern),将来自客户端的请求封装为一个对象,无须了解这个请求激活的动作或有关接受的处理细节。命令模式的根本目的在于将请求者与实现者之间解耦。其实命令者模式与很多其他模式一样,就是在请求者和实现者之间增加一个中间人的角色,来达到解耦的目的。通过对中间角色的特殊设置从而形成不同的设计模式,命令模式也不例外。命令模式正式通过一个中间的命令者完成请求与实现之间的解耦。


角色:

(1)抽象命令角色(Command):生命命令执行操作的接口,由java接口或者抽象类来实现。

(2)具体命令角色(Concrete Command):在具体的命令角色中绑定命令接收者,命令调用接受者做出相应的操作,从而实现命令角色生命的执行操作的接口行为。

(3)请求者角色(Invoker):命令的启动者角色,调用命令对象执行请求。

(4)接收者角色(Recevier):具体命令执行时的行为对象,任何类都可能作为一个接收者。

(5)客户角色(Client):创建一个具体命令对象,并分命令的接受者。



类图:



实例:

我觉得《软件秘籍》中这个例子并不好,因为邮局发送邮件,邮件送到接收者手中,邮局封装成一个命令太牵强。而且感觉约定俗成,接口应该名叫execute。所以直接上《Head First》中的例子。

public class Light {

    public void off() {
        System.out.println("Light is off!");
    }

    public void on() {
        System.out.println("Light is on!");
    }

}

/**
*命令接口
**/
public interface Command{
    public void execute();
}

/**
*控制灯的命令(开灯)
**/
public class LightOnCommand implements Command{
    //命令中持有一个灯对象
    Light light;
    public LightOnCommand(Light light){
        this.light=light;
    }

    //实现接口中的execute()方法
    public void execute(){
        //开灯
        light.on();
    }
}

public class SimpleRemoteControl{
    //包含命令
    Command command;
    public SimpleRemoteControl(){}

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

    //按钮方法,按下按钮时执行动作
    public void buttonWasPressed(){
        //调用命令的执行方法
        this.command.execute();
    }
}

public class RemoteControlTest{
    public static void main(String[] agrs){
        //实例化灯(接收者)
        Light light = new Light();
        //实例化开灯命令类(包含一个灯的对象)
        LightOnCommand lightOnCommand = new LightOnCommand (light);
        //实例化控制装置(遥控器)
        SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl();

        //将开灯命令装入控制装置
        simpleRemoteControl.setCommand(lightOnCommand );
        //执行方法(开灯)
        simpleRemoteControl.buttonWasPressed();
    }
}

分析:

命令模式就是把命令提取成一个接口,命令模式就是把命令提取成一个接口,命令模式就是把命令提取成一个接口,重要的事情说三遍。

命令接口有一个execute方法,命令接口有一个execute方法,命令接口有一个execute方法,重要的事情说三遍。


使用场合:

(1)抽象出待执行的动作以参数化某对象。类似于过程设计中的回调机制,而命令模式正式回调机制的一个面向对象的替代品。

(2)在不同的时刻制定、排列和执行请求。

(3)需要支持可撤销的操作。

(4)需要支持修改日志功能。这样当系统崩溃时,这些修改可以被重做一遍。

(5)需要支持事务系统。


一句话总结:

命令封装成了一个接口,命令持有接受者引用,发送者持有命令接口。


参考资料:

《软件秘笈---设计模式那点事》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值