Java设计模式之命令模式
Posted 红日666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式之命令模式相关的知识,希望对你有一定的参考价值。
一、定义:
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
二、角色:
命令模式UML类图:
1、Command:
定义命令的接口,声明执行的方法。
2、ConcreteCommand:
命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
3、Receiver:
接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
4、Invoker:
要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
5、Client:
创建具体的命令对象,并且设置命令对象的接收者。
三、具体实现:
1、定义Command,声明执行操作的接口:
/** Command角色:
* 命令的接口,声明执行的方法。
*/
public interface Command
/**
* 执行
*/
void execute();
/**
* 撤销
*/
void unDo();
2、定义ConcreteCommand具体实现,将一个接收者对象绑定于一个动作。
/**
* ConcreteCommand角色:
* 命令接口实现对象
*/
public class ConcreteCommand implements Command
/**
* 持有一个接受者Receiver的引用,绑定一个特定的操作
*/
private Receiver receiver;
public ConcreteCommand(Receiver receiver)
this.receiver = receiver;
@Override
public void execute()
receiver.action();
@Override
public void unDo()
receiver.unAction();
3、定义接收者Receiver,真正执行命令的对象:
/**
* Receiver角色:
* 接收者,真正执行命令的对象。
*/
public class Receiver
public void action()
System.out.println("执行一个命令");
public void unAction()
System.out.println("撤销一个命令");
4、定义Invoker,要求该命令执行这个请求。
/**
* Invoker角色:
* 要求该命令执行这个请求。
*/
public class Invoker
/**
* 调用者持有一个命令对象
*/
private Command command;
public void setCommand(Command command)
this.command = command;
public Command getCommand()
return command;
public void executeCommand()
command.execute();
public void unExecuteCommand()
command.unDo();
5、定义Client,测试一下我们的命令模式。
/**
* Client角色:
* 创建一个具体命令对象并设定它的接收者。
*/
public class Client
public static void main(String[] args)
//创建命令的接受者
Receiver receiver = new Receiver();
//创建命令对象,并设置它的接受者
Command command = new ConcreteCommand(receiver);
// 创建命令执行者,并将相应的命令作为参数传递给Invoker
Invoker invoker = new Invoker();
invoker.setCommand(command);
// 命令执行
invoker.executeCommand();
invoker.unExecuteCommand();
输出结果:
四、适用场景及优缺点:
1、适用场景:
1).系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
2).系统需要在不同的时间指定请求、将请求排队和执行请求。
3).系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
4).系统需要将一组操作组合在一起,即支持宏命令。
2、优点:
1).降低对象之间的耦合度。
2).新的命令可以很容易地加入到系统中。
3).可以比较容易地设计一个组合命令。
4).调用同一方法实现不同的功能
3、缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
参考:
Java设计模式综述
以上是关于Java设计模式之命令模式的主要内容,如果未能解决你的问题,请参考以下文章