命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式初步理解:客户直接去操作机器的话要输入一条一条的命令,这样做显然效率很低。可以写成脚本的形式,一次执行。命令模式也是这样的,为了降低耦合,将一个个命令封装成对象。客户不直接调用命令去执行任务,有个记录的类暂且叫服务类。服务类用来记录用户发出的请求,当所有的请求都发送完成后,再调用服务类的执行方法。因此,命令类向服务类进行聚合。命令对象有很多种,但是又有共同的部分,那就是这条命令的执行者。因此,有必要抽象出一个命令基类。命令类和执行类之间是关联关系,存在一个抽象方法,其实现类中的实现是调用执行者的方法。
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();
}
}
命令模式的作用:
- 能较容易的设计一个命令队列
- 在需要的情况下可以方便地将命令记录日志
- 允许接受请求的一方决定是否要否决请求
- 可以容易地实现对请求的撤销和重做
- 增加新的命令类不影响其他的类,因此增加新的具体命令类很容易
上一篇 |
---The End---
| 下一篇 |