设计模式十四————命令模式

命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式初步理解:客户直接去操作机器的话要输入一条一条的命令,这样做显然效率很低。可以写成脚本的形式,一次执行。命令模式也是这样的,为了降低耦合,将一个个命令封装成对象。客户不直接调用命令去执行任务,有个记录的类暂且叫服务类。服务类用来记录用户发出的请求,当所有的请求都发送完成后,再调用服务类的执行方法。因此,命令类向服务类进行聚合。命令对象有很多种,但是又有共同的部分,那就是这条命令的执行者。因此,有必要抽象出一个命令基类。命令类和执行类之间是关联关系,存在一个抽象方法,其实现类中的实现是调用执行者的方法。


code...

下面的例子是给机器人下达多条命令
机器人有三个功能:做饭、扫地和娱乐:

public class Robot {
    public void cook()
    {
        System.out.println("这是机器人做饭的过程");
    }
    public void sweep()
    {
        System.out.println("这是机器人打扫卫生的过程");
    }
    public void entertain()
    {
        System.out.println("这是机器人娱乐的过程");
    }
}

命令类,对下达给机器人的命令进行封装。基类:

public abstract class Command {
    protected Robot robot;
    public Command(Robot robot)
    {
        this.robot=robot;
    }
    public abstract void Excute();
}

具体的实现:

public class Cook extends Command {
    public Cook(Robot robot) {
        super(robot);//调用父类构造
    }
    @Override public void Excute() {
        this.robot.cook();//调用执行者的执行方法
    }
}

其他两个的功能代码段与此类似。
命令的记录:

public class Waiter {
    private ArrayList<Command> arrayList=new ArrayList<>();//记录
    public void setCommand(Command command)
    {
        arrayList.add(command);
    }
    public void Notify()
    {
       for(Command com:arrayList)
       {
           com.Excute();
       }
    }
}

客户端:

public class Main {
    public static void main(String[] args) {
        //准备工作
        Robot robot=new Robot();
        Command command1=new Cook(robot);
        Command command2=new Sweep(robot);
        Command command3=new Entertain(robot);
        Waiter waiter=new Waiter();

        //下定命令
        waiter.setCommand(command1);
        waiter.setCommand(command3);
        waiter.Notify();
    }
}

命令模式的作用:

  1. 能较容易的设计一个命令队列
  2. 在需要的情况下可以方便地将命令记录日志
  3. 允许接受请求的一方决定是否要否决请求
  4. 可以容易地实现对请求的撤销和重做
  5. 增加新的命令类不影响其他的类,因此增加新的具体命令类很容易

上一篇
---The End---
下一篇
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值