命令模式

来源:互联网 发布:家具衣柜下料尺寸算法 编辑:程序博客网 时间:2024/06/07 09:33

应用场景:

(1)命令模式使新的命令很容易地被加入到系统里。

  (2)允许接收请求的一方决定是否要否决请求。

  (3)能较容易地设计一个命令队列。

  (4)可以容易地实现对请求的撤销和恢复。

  (5)在需要的情况下,可以较容易地将命令记入日志。


这里以MP3的播放,停止,回放命令来说明

/**
 * 抽象命令,命令的抽象对象
 * @author ZhangSheng
 *
 */
public interface Command {
public void execute();
}

-----------------------------------------

/**
 * 命令的接受者
 * @author ZhangSheng
 *
 */
public class Mp3 {
public void play(){
System.out.println("播放");
}

public void stop(){
System.out.println("停止");
}

public void rePaly(){
System.out.println("回放");
}
}

--------------------------------------------------------------------

/**
 * 命令管理者,命令发起者
 * @author ZhangSheng
 *
 */
public class CommandManager {
private Command command;

//宏命令
private List<Command> list = new ArrayList<Command>();  

//执行宏命令
public void executeAll(){
if(list.size()!=0){
System.out.println("执行宏命令"); 
for (Command command : list) {
command.execute();
}
}else{
System.out.println("还未加入任何命令");
}
}

public void addCommand(Command command){
if(command!=null){
list.add(command);
}else{
System.out.println("加入的命令不能为空"); 
}
}

public void removeCommand(Command command){
if(command!=null){
list.remove(command);
}else{
System.out.println("移除的命令不能为空"); 
}


//执行单一命令
public void execute(){
if(command!=null){
System.out.println("执行单一命令"); 
command.execute(); 
}else{
System.out.println("还未初始化单一命令");  
}
}


public void setCommand(Command command) {
this.command = command;
}

private static CommandManager manager = new CommandManager();

public static CommandManager getInstance(){
return manager;
}
}

--------------------------------------------------------------------------------------------------------------

/**
 * 播放命令
 * @author ZhangSheng
 *
 */
public class PlayCommand implements Command {


private Mp3 mp3;

public PlayCommand(Mp3 mp3) {
super();
this.mp3 = mp3;
}


@Override
public void execute() {
mp3.play();
}
}

---------------------------------------------------------------------

/**
 * 回放命令
 * @author ZhangSheng
 *
 */
public class RePlayCommand implements Command {


private Mp3 mp3;

public RePlayCommand(Mp3 mp3) {
super();
this.mp3 = mp3;
}


@Override
public void execute() {
mp3.rePaly();
}
}

------------------------------------------------------------------------

/**
 * 停止命令
 * @author ZhangSheng
 *
 */
public class StopCommand implements Command {


private Mp3 mp3;

public StopCommand(Mp3 mp3) {
super();
this.mp3 = mp3;
}


@Override
public void execute() {
mp3.stop();
}
}

-------------------------------------------------------------------------------------

public class Test {


/**
* 测试类
*/
public static void main(String[] args) {
//命令管理者,发起者,请求者
CommandManager commandManager = CommandManager.getInstance();

//命令接受者
Mp3 mp3 = new Mp3();

//具体的命令
PlayCommand playCommand = new PlayCommand(mp3);
StopCommand stopCommand = new StopCommand(mp3);
RePlayCommand rePlayCommand = new RePlayCommand(mp3); 

//请求单一播放命令
commandManager.setCommand(playCommand);
commandManager.execute();

//请求宏命令
commandManager.addCommand(stopCommand);
commandManager.addCommand(rePlayCommand);
commandManager.addCommand(stopCommand);
commandManager.addCommand(playCommand);
commandManager.executeAll();

commandManager.removeCommand(stopCommand);
commandManager.executeAll();
}
}

----------------------------------------------------------------

Result:

执行单一命令
播放
执行宏命令
停止
回放
停止
播放
执行宏命令
回放
停止
播放

0 0
原创粉丝点击