`

设计模式-命令模式

阅读更多

命令(Command)模式属于对象的行为模式,把一个请求或者操作封装到一个对象中,允许系统使用不同的请求把客户端参数化,对请求排队或者记录到请求日志,可以提供命令的撤销和恢复功能。命令模式是对命令的封装,把发出的命令的责任和执行命令的责任分开,委派给不同的对象。

设计角色:

         客户(Client)角色:创建一个具体命令对象并确定接收者。

         命令(Command)角色:声明一个给所有具体命令的抽象接口。

         具体命令(ConcreteCommand)角色:定义一个接受者和行为之间的弱耦合;实现execute()方法,负责调用接受者的相应操作。execute方法通常叫做执行方法。

         请求者(Invoker)角色:负责调用命令对象执行请求,相关方法叫做行动方法。

         接收者(Reveiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

例子:

package cn.design.pattern.demo.command.client;

import cn.design.pattern.demo.command.command.Command;
import cn.design.pattern.demo.command.command.PlayCommand;
import cn.design.pattern.demo.command.command.RewindCommand;
import cn.design.pattern.demo.command.command.StopCommand;
import cn.design.pattern.demo.command.invoker.Keypad;
import cn.design.pattern.demo.command.reviever.AudioPlayer;

/**
 * 客户端:创建命令和确定接收者
 */
public class Client {

	private static Keypad keypad;
	private static AudioPlayer player = new AudioPlayer();		// 接收者
	
	public static void main(String[] args) {
		test1(); test2();
	}
	
	private static void test1() {
		// 创建三个命令并将接收者传入
		Command play = new PlayCommand(player);
		Command stop = new StopCommand(player);
		Command rewind = new RewindCommand(player);
		
		keypad = new Keypad(play, rewind, stop);
		keypad.play(); keypad.stop(); keypad.rewind();
	}
	
	private static void test2() {
		
		Command play = new Command() {
			@Override
			public void execute() {
				player.play();
			}
		};
		Command rewind = new Command() {
			@Override
			public void execute() {
				player.rewind();
			}
		};
		Command stop = new Command() {
			@Override
			public void execute() {
				player.stop();
			}
		};
		
		keypad = new Keypad(play, rewind, stop);
		keypad.play(); keypad.stop(); keypad.rewind();
	}
}

package cn.design.pattern.demo.command.command;

/**
 * 抽象命令角色
 */
public interface Command {

	/**
	 * 执行方法
	 */
	public void execute();
}

package cn.design.pattern.demo.command.command;

import cn.design.pattern.demo.command.reviever.AudioPlayer;

/**
 * 具体命令角色
 * 定义一个接受者和行为之间的弱耦合
 */
public class PlayCommand implements Command {

	private AudioPlayer audioPlayer;	// 接收者
	
	public PlayCommand(AudioPlayer audioPlayer) {
		this.audioPlayer = audioPlayer;
	}
	
	/**
	 * 执行方法
	 */
	@Override
	public void execute() {
		// 调用接收者相应方法,执行命令
		audioPlayer.play();
	}

}

package cn.design.pattern.demo.command.command;

import cn.design.pattern.demo.command.reviever.AudioPlayer;

/**
 * 具体命令角色
 */
public class RewindCommand implements Command {
	
	private AudioPlayer audioPlayer;
	
	public RewindCommand(AudioPlayer audioPlayer) {
		this.audioPlayer = audioPlayer;
	}

	@Override
	public void execute() {
		audioPlayer.rewind();
	}

}

package cn.design.pattern.demo.command.command;

import cn.design.pattern.demo.command.reviever.AudioPlayer;

/**
 * 具体命令角色
 */
public class StopCommand implements Command {

	private AudioPlayer audioPlayer;
	
	public StopCommand(AudioPlayer audioPlayer) {
		this.audioPlayer = audioPlayer;
	}
	
	@Override
	public void execute() {
		audioPlayer.stop();
	}

}

package cn.design.pattern.demo.command.invoker;

import cn.design.pattern.demo.command.command.Command;

/**
 * 请求者角色
 * 负责调用命令对象执行请求
 */
public class Keypad {

	private Command playCmd;		// 命令对象
	private Command rewindCmd;
	private Command stopCmd;

	public Keypad(Command play, Command rewind, Command stop) {
		this.playCmd = play;
		this.rewindCmd = rewind;
		this.stopCmd = stop;
	}

	/**
	 * 行动方法
	 */
	public void play() {
		// 执行命令请求
		playCmd.execute();
	}

	public void rewind() {
		rewindCmd.execute();
	}

	public void stop() {
		stopCmd.execute();
	}
}

package cn.design.pattern.demo.command.reviever;

/**
 * 接收者角色
 */
public class AudioPlayer {

	public void play() {
		System.out.println("播放");
	}
	
	public void rewind() {
		System.out.println("倒带");
	}
	
	public void stop() {
		System.out.println("停止");
	}
}

 特点:

        1.新的命令很容易地被加入到系统里.

        2.允许接受请求的一方决定是否要否决请求.

        3.可以方便地设置一个命令队列.

        4.实现对请求的Undo和Redo.

        5.比较容易地将命令计入日志.

0
1
分享到:
评论

相关推荐

    设计模式-命令模式(讲解及其实现代码)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...

    java常用设计模式-命令模式

    Java 命令模式设计模式详解 命令模式(Command Pattern)是一种行为设计模式,它允许将请求封装为一个对象,从而使不同的请求可以使用不同的参数进行参数化,队列或日志请求,以及支持可撤销的操作。在 Java 中,...

    JAVA-设计模式-行为型模式-命令模式

    JAVA-设计模式-行为型模式-命令模式

    java设计模式-命令模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    设计模式-命令模式(C#)代码

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C#编程中,命令模式的应用广泛且实用。 命令模式的核心结构...

    【设计模式-命令模式实战之WCS详细设计与实现(三)】堆垛机控制示例

    在本文中,我们将深入探讨设计模式中的命令模式,并结合实际案例——WCS(Warehouse Control System,仓库控制系统)的堆垛机控制,来详细介绍其详细设计与实现。命令模式是一种行为设计模式,它将请求封装为一个...

    [删除] 设计模式 - 命令模式(C++实例)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C++中,命令模式通常用来解耦调用者和实现者,使得系统更加...

    c++设计模式-行为型模式-命令模式

    c++设计模式-行为型模式-命令模式;qt工程 ;c++简单源码; 命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将...

    设计模式----命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...

    设计模式--命令模式java例子

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,命令模式的应用广泛且实用。 命令模式的核心是将...

    设计模式6---命令模式,精美PPT

    该PPT用于公司内部分享设计模式6---命令模式之用,言简意赅,形象生动.故此分享,希望大家一起学习

    设计模式--命令模式 (模仿遥控器)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本例中,我们将通过模仿遥控器来理解命令模式的应用。 遥控器...

    设计模式-Java语言中的应用

    设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...

    C++设计模式-基于QT4开源跨平台开发框架 源码

    6. **命令模式** - 可以利用QT4的QMetaObject系统和QSignalMapper来实现命令模式,通过信号触发不同的操作。 7. **适配器模式** - QT4的QAbstractItemModel和其子类允许将不同数据源适配到统一的模型接口,使得各种...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持可撤销的操作。 - 解释器模式(Interpreter):给定一种语言,定义它的文法表示,并提供一个解释器来处理这种语言中的句子...

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    软件设计模式--填空题+简答题(复习7).rar

    2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...

Global site tag (gtag.js) - Google Analytics