博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模式19.命令模式-Java
阅读量:4035 次
发布时间:2019-05-24

本文共 1690 字,大约阅读时间需要 5 分钟。

1.定义

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队活记录请求日志,以及支持可撤销的操作。

在这里插入图片描述

类比:

在这里插入图片描述

2.基本代码

(1)Command类,用来声明执行操作的接口

package designmode.order;public abstract  class Command {
protected Receiver receiver; public Command(Receiver receiver){
this.receiver=receiver; } abstract public void Execute();}

(2)ConcreteCommand类,将一个接收者绑定与一个动作,调用接收者相应的操作,以实现执行动作

package designmode.order;public class ConcreteCommand extends  Command{
public ConcreteCommand(Receiver receiver){
super(receiver); } @Override public void Execute() {
receiver.action(); }}

(3)Invoker类,要求该命令执行这个请求

package designmode.order;public class Invoker {
private Command command; public void SetCommand(Command command){
this.command=command; } public void ExecuteCommand(){
command.Execute(); }}

(4)Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者

package designmode.order;public class Receiver {
public void action(){
System.out.println("执行请求!"); }}

(5)客户端代码。创建一个具体命令对象并设定它的接收者

package designmode.order;public class Client {
public static void main(String[] args) {
Receiver receiver=new Receiver(); Command command=new ConcreteCommand(receiver); Invoker i=new Invoker(); i.SetCommand(command); i.ExecuteCommand(); }}
执行请求!Process finished with exit code 0

3.应用场景

(1)优点

  • 能较容易设计一个命令队列
  • 在需要的情况下,可以较容易地将命令计入日志
  • 允许接收请求地一方决定是否要否定请求
  • 可以容易的实现对请求的撤销和重做
  • 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令很容易。
  • 把请求一个操作的对象(eg客户)与知道怎么执行一个操作的对象(eg厨师)分隔开。

(2)在不清楚是否需要某个功能时, 要不要实现命令模式?

不实现。 敏捷开放的原则,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不着急去实现它,实际上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才更有意义。

转载地址:http://etfdi.baihongyu.com/

你可能感兴趣的文章
/proc文件系统读出来的数据是最新的吗?
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
Vue组件
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>
selenium学习资料
查看>>
python单元测试unittest学习
查看>>
Errors running builder 'Validation' on project 'jumi_3.0'
查看>>
SpringMVC学习笔记
查看>>
springMVC如何接收前端传递的数组数据
查看>>
查看当前占用端口、关闭当前端口所暂用的进程
查看>>
Eclipse中有用的快捷键
查看>>
mysql将表字段信息拼接转换成实体类中的属性书写格式
查看>>
有return的情况下try catch finally的执行顺序
查看>>
input文本框中value值有双引号的问题
查看>>
java多线程简介
查看>>
web.xml配置加载顺序
查看>>
ServletContextListener使用详解
查看>>
UrlRewriteFilter使用说明
查看>>
java对redis的基本操作
查看>>