博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式命令模式(行为型)
阅读量:6904 次
发布时间:2019-06-27

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

@[toc]

一、模式定义

命令模式(Command Pattern):将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分离,两者之间通过命令对象进行沟通,方便将命令对象进行储存、传递、调用、增加与管理。命令模式别名为动作(Action)模式或事务(Transaction)模式,属于对象行为型模式。

二、模式角色

命令模式包括如下角色:

  • Client:客户类,负责调用
  • Command:抽象命令类,声明执行命令的接口,拥有执行命令的抽象方法 execute()。
  • ConcreteCommand:具体命令类,是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
  • Invoker:调用者,请求的发送者,通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。
  • Receiver:接收者,执行命令功能的相关操作,是具体命令对象业务的真正实现者。

三、模式分析

命令模式的本质:是对命令进行封装,将发出命令的责任和执行命令的责任分离。

命令模式的实际执行者是接收者(Receiver),调用者和接收者两者之间通过命令对象进行沟通。

命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

典型的命令模式代码

抽象命令类:

public abstract class Command{	public abstract void execute();} 复制代码

具体命令类:

public class ConcreteCommand extends Command{	private Receiver receiver;	public void execute()	{		receiver.action();	}} 复制代码

调用者Invoker类:

public class Invoker{	private Command command;		public Invoker(Command command)	{		this.command=command;	}		public void setCommand(Command command)	{		this.command=command;	}		//业务方法,用于调用命令类的方法	public void call()	{		command.execute();	}} 复制代码

接收者(Receiver)类:

public class Receiver{	public void action()	{		//具体操作	}} 复制代码

四、典型例子

例子来自一书

电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。显然,电视机遥控器就是一个典型的命令模式应用实例。

抽象命令类:

public interface AbstractCommand{	public void execute();}复制代码

具体的命令类:

换台

public class TVChangeCommand implements AbstractCommand{	private Television tv;	public TVChangeCommand()	{		tv = new Television();	}	public void execute()	{		tv.changeChannel();	}}复制代码

关机

public class TVCloseCommand implements AbstractCommand{	private Television tv;	public TVCloseCommand()	{		tv = new Television();	}	public void execute()	{		tv.close();	}}复制代码

开机

public class TVOpenCommand implements AbstractCommand{	private Television tv;	public TVOpenCommand()	{		tv = new Television();	}	public void execute()	{		tv.open();	}}复制代码

接收者Receiver类:

public class Television{	public void open()	{		System.out.println("打开电视机!");	}		public void close()	{		System.out.println("关闭电视机!");			}		public void changeChannel()	{		System.out.println("切换电视频道!");	}}复制代码

调用者(Invoker)类

public class Controller{	private AbstractCommand openCommand,closeCommand,changeCommand;		public Controller(AbstractCommand openCommand,AbstractCommand closeCommand,AbstractCommand changeCommand)	{		this.openCommand=openCommand;		this.closeCommand=closeCommand;		this.changeCommand=changeCommand;	}		public void open()	{		openCommand.execute();	}		public void change()	{		changeCommand.execute();	}		public void close()	{		 closeCommand.execute();		}}复制代码

五、适用场景

  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
  • 系统需要将一组操作组合在一起,即支持宏命令。
  • 系统需要在不同的时间指定请求、将请求排队和执行请求。
  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

转载于:https://juejin.im/post/5cb6b3a96fb9a0689455b002

你可能感兴趣的文章
(原创)Python文件与文件系统系列(1)—— file 对象
查看>>
android开发 缩放到指定比例的尺寸
查看>>
1.angular之Hello World
查看>>
Spark Streaming中空batches处理的两种方法(转)
查看>>
为什么未来是全栈工程师的世界?
查看>>
php示例代码之 使用PHP的MySQL标准函数
查看>>
.net中的泛型
查看>>
VS2010编译Boost 1.56
查看>>
mysql5.x(<7) sql文件导入到5.7
查看>>
常用正则表达式
查看>>
TortoiseSvn安装的时候,将svn的命令行工具单独隔离出来
查看>>
GitHub 入门教程
查看>>
《转载》脚本实现从客户端服务端HTTP请求快速分析
查看>>
C# 轻松实现对窗体(Form)换肤[转]
查看>>
subversion adobe-flashplugin
查看>>
开启服务和停止服务
查看>>
谎言与逻辑的故事三则
查看>>
【iCore双核心组合是开发板例程】【uCGUI 例程及代码包下载】
查看>>
Dell笔记本刷回低版本bios的方法
查看>>
《程序员面试宝典》之错误纰漏(持续更新。。。)
查看>>