命令模式

1、什么是命令模式?

  命令模式(Commond Pattern):将来自客户端的请求封装为一个对象,无需了解这个请求激活的动作或有关接受这个请求的处理细节。命令模式的根本目的在于将“请求者”与“实现者”之间解耦。

  其实命令模式和其他许多设计模式一样,就是在请求者和实现者中间加一个中间人的角色,来达到解除耦合的目的。通过对中间人的特殊设置,从而形成不同的设计模式,命令模式也不例外。命令模式正是通过一个中间的命令者角色完成请求与实现之间的解耦。

2、命令模式的类图:

  命令模式分为三部分,调用者、接收者和命令类,其实质是在命令发出者和命令接受者之间增加第三方来实现解耦,下面来使用实例来说明。

3、命令模式实例

  需求:使用命令模式完成邮局案例,需要一个发件人、邮局、收件人三种实体对象。发件人投递信件给邮局,邮局需要做的是将信件发给收件人,自始至终,我们都没有让发件人和收件人进行直接通信,也就是说,命令的调用者和接收者是没有联系的,完全通过邮局这个中间人来联系。

  案例类图:

  

  首先创建一个“IReceiver”收件人接口,其中只有一个读取信件的readMail方法:

<span style="font-size:18px;">
/*
 * 功能:命令模式,接收者
 * 		信件接收者
 */
public interface IReceiver {
	public void readMail(String message);
}</span>

  接下来,我们创建收件人类,并实现收件人接口:

<span style="font-size:18px;">
/*
 * 功能:接收者实现类
 */
public class ReceiverImp implements IReceiver {

	@Override
	public void readMail(String message) {
		System.out.println("收件人读取信息:"+message);
	}
}</span>

  创建邮局接口IPost,该接口中定义发送信件的方法sendMail:

<span style="font-size:18px;">
/*
 * 功能:邮局接口,即命令接口
 *
 */
public interface IPost {
	public void sendMail(String message);
}</span>

  创建邮局实现类,因为邮局需要将信件转发给收件人,所以要保持对收件人的引用:

<span style="font-size:18px;">
/*
 * 功能:邮局接口实现类
 */
public class IPostImp implements IPost {
	// 保持对收件人的引用
	private final IReceiver receiver;
	//通过构造方法传入
	public IPostImp(IReceiver receiver){
		this.receiver = receiver;
	}
	//具体发送功能
	@Override
	public void sendMail(String message) {
		System.out.println("信息已经发送给收件人!");
		receiver.readMail(message);
	}
}</span>

  接下来,我们来创建发送者,因为发送者需要将信件放到邮局,所以要保持对邮局的引用,我们通过构造方法来传入这个引用:

<span style="font-size:18px;">
/*
 * 功能:发送者,即命令调用者
 */
public class Invoker {
	//保留邮局引用
	private IPost ipost;
	//设置邮局对象实例
	public void setPost(IPost ipost){
		this.ipost=ipost;
	}
	//发件人发送信息
	public void postMail(String message){
		System.out.println("发信人开始投递邮件给邮局。。。");
		ipost.sendMail(message);
	}
}</span>

  接下来就是我们的测试类(客户端)了,创建发件人、收件人、邮局实例,然后进行发邮件:

<span style="font-size:18px;">
/*
 * 功能:测试类
 */
public class Test {
	public static void main(String[] args) {
		Invoker in = new Invoker();
		ReceiverImp receiver = new ReceiverImp();
		IPostImp post = new IPostImp(receiver);
		in.setPost(post);
		in.postMail("我来了!");
	}
}</span>

  信件通过邮局发送,而发件人和收件人之间却没有任何联系,这就是命令模式的应用,也是符合迪米特法则(最少知识原则)的,即两个实体之间如果没有必要进行联系的话,那就尽量不要让它们进行直接联系,而是采取中间人的方式对其进行解耦。

  总结:命令模式中,精髓就是请求的启动者发送命令请求给具体命令,由具体命令负责发送命令消息给命令的接收者,具体命令就是模式模式中的中间人角色。

  命令模式的适用场合:

    抽象出待执行的动作以参数化某对象。类似于过程设计中的回调机制,而命令模式正式回调机制的一个面向对象的替代品;

    在不同的时刻指定、排列和执行请求;

    需要支持可撤销的操作;

    需要支持修改日志功能。这样当系统崩溃时,这些修改可以被重做一遍;

需要支持事务系统。

时间: 2024-08-29 08:30:19

命令模式的相关文章

php设计模式 Command(命令模式)

<?php /** * 命令模式 * * 将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排除或记录请求日志,以及支持可取消的操作 */ interface Command { public function execute(); } class Invoker { private $_command = array(); public function setCommand($command) { $this->_command[] = $command; } publ

.NET中的设计模式四:命令模式

设计 命令模式(Command)结构并不复杂,简单的说,就是将某些职责封装成对象,对象的激发者(Invoker)和接收者(Reciever)都不过问命令的执行过程.用这样的方式解除了激发者和接受者之间的耦合,为程序提供了更清晰的层次结构.实际运用中经常是将系统中的命令抽象成一个接口,所有的命令都是这个接口的实现,如下所示: Command类是ICommand的实现,Command类实现了execute方法,其他命令类都是Command方法的子类.这样激发者接受者和接受者面临的环境就非常简单了:统

用命令模式实现对象存储——对象与关系数据库

一.开发背景 面向对象方法在软件开发的分析.设计以及编码中作用越来越重要,它 在适应系统需求变化.提高软件可重用性和开发效率方面有着其它开发方法无法比拟的优点 .面向对象思想将应用域中的概念描述成对象,应用系统由一系列对象构成,对象之间可以 传递消息,系统的运作可说就是对象间的协同工作.有过开发经验人都知道,应用系统中有 些是对象是要持久存在的,需要将它们存入磁盘,以便在重启系统时能够调入系统.这些对 象在面向对象方法中主要指实体对象,为了一致,本文中以实体对象代表所有需要存储的对 象. 目前,

传统设计模式(六)命令模式

命令模式将请求封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.用户程序在使用的时候,只与该命令对象打交道,而不用与一类对象打交道,降低了耦合性,提高了程序设计的灵活性. 我们还是那数据库操作为例 public class DBInstance { public void ExecuteNonQuery() { } public void ExecuteDataset() { } } public class SqlInstance : DBInstanc

解读设计模式----命令模式(Command Pattern)

本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文.*** 原文连接http://www.dofactory.com/Patterns/PatternCommand.aspx 命令模式意图: GOF 在<设计模式>一书中阐述其意图:"将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作."这里所谓的"不同的请求"也既意味着请求可能发生的变化,是一个可能扩展的功能点. 命令

.Net设计模式实例之命令模式(Command Pattern)

一.命令模式简介(Brief Introduction) 命令模式(Command Pattern)将请求封装为一个对象,从而使你用不同的请求对客户进 行参数化,对请求排队或纪录请求日志,以及支持可撤销的操作. Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoabl

用expect免密码进入MySQL命令模式

一般情况下,我们想要进入MySQL命令模式总是需要按如下交互输入密码确认,才能进入命令行模式: zhanhailiang@linux-06bq:~> mysql -u sl -p Enter password: 其实我们完全可以使用expect编写脚本,来通来expect与shell交互通信来实现免密码登录: zhanhailiang@linux-06bq:~> cat mysql.sh #!/usr/local/bin/expect spawn /usr/local/services/mys

php设计模式之命令模式的应用详解

 命令模式:将一个请求封装为一个对象,从而你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销操作.  命令类: 1.命令角色:声明了一个给所有具体命令类的抽象接口.这是一个抽象角色. 2.具体命令角色:定义一个接受者和行为之间的弱耦合:实现execute方法,负责调用接受的相应操作.execute()方法通常叫做执行方法 3.客户角色:创建一个具体命令对象并确定其接受者. 4.请求者角色:负责调用命令对象执行请求,相关的方法叫做行动方法. 5.接受者角色:负责具体实施和执

php设计模式之命令模式使用示例

 这篇文章主要介绍了php设计模式之命令模式使用示例,命令模式将一个请求封装为一个对象,从而你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销操作 命令类: 1.命令角色:声明了一个给所有具体命令类的抽象接口.这是一个抽象角色. 2.具体命令角色:定义一个接受者和行为之间的弱耦合:实现execute方法,负责调用接受的相应操作.execute()方法通常叫做执行方法 3.客户角色:创建一个具体命令对象并确定其接受者. 4.请求者角色:负责调用命令对象执行请求,相关的方法叫