java-设计模式(行为型)-【命令模式】

1.命令模式(CommandMode)

   定义:命令模式就是对命令的封装,将发起命令的动作和执行命令的动作分开,委派给不同对象实现

           目的是使命令的发起者和命令的执行者之间解耦,实现请求和执行的分开。

   优点:

      ●  更松散的耦合

  命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,也就是说发起命令的对象完全不知道具体实现对象是谁,也不知道如何实现。

  ●  更动态的控制

  命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。

  ●  很自然的复合命令

  命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。

  ●  更好的扩展性

  由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,

      把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。

    关系图:

             

2.音乐播放器举例

   2.1 接收者接口

interface AudioPlayer
{
	void play();
	void pause();
	void remind();
}
//接收执行者
public class Receiver implements AudioPlayer {

	@Override
	public void play() {
		// TODO Auto-generated method stub
	  System.out.println("播放。。。");	
	}

	@Override
	public void pause() {
		// TODO Auto-generated method stub
		System.out.println("暂停。。。");
	}

	@Override
	public void remind() {
		// TODO Auto-generated method stub
		System.out.println("倒带。。。");
	}

}

  2.2 命令接口

//命令接口
public interface Command {
     //执行命令
	 void execute();
}
//各种封装的命令
//播放命令
class PlayCommand implements Command
{
	private AudioPlayer ap=null;
	public PlayCommand (AudioPlayer ap)
	{
		this.ap=ap;
	}
	@Override
	public void execute() {
	  ap.play();	 
	}
}
//暂停命令
class PauseCommand implements Command
{
    private AudioPlayer ap=null;
    public PauseCommand(AudioPlayer ap)
    {
    	 this.ap=ap;
    }
    		
	@Override
	public void execute() {
		 ap.pause();
	}
}
//倒带命令
class RewindCommand implements Command
{
    private AudioPlayer ap=null;
    public RewindCommand (AudioPlayer ap)
    {
    	this.ap=ap;
    }
	@Override
	public void execute() {
	   ap.remind();
	}
}

  2.3 发起者:键盘

public class Keypad {
  
    //三种命令
	private Command playcommand=null;
    private Command pausecommand=null;
    private Command rewindcommand=null;
    public void play()
    {
    	playcommand.execute();
    }
    public void pause()
    {
    	pausecommand.execute();
    }
    public void rewind()
    {
    	rewindcommand.execute();
    }
	public Command getPlaycommand() {
		return playcommand;
	}
	public void setPlaycommand(Command playcommand) {
		this.playcommand = playcommand;
	}
	public Command getPausecommand() {
		return pausecommand;
	}
	public void setPausecommand(Command pausecommand) {
		this.pausecommand = pausecommand;
	}
	public Command getRewindcommand() {
		return rewindcommand;
	}
	public void setRewindcommand(Command rewindcommand) {
		this.rewindcommand = rewindcommand;
	}
 
}

  2.4 测试

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Keypad kp=new Keypad();
        AudioPlayer ap=new Receiver();
        Command pause=new PauseCommand(ap);
        Command play=new PlayCommand(ap);
        Command rewind=new RewindCommand(ap);
        //设置命令        
        kp.setPlaycommand(play);
        kp.setPausecommand(pause);
        kp.setRewindcommand(rewind);
        //执行命令
        kp.play();
        kp.pause();
        kp.rewind();
	}

}

  2.5 运行结果

播放。。。
暂停。。。
倒带。。。

  

 

posted @ 2015-04-20 16:33  beyondbycyx  阅读(158)  评论(0编辑  收藏  举报