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 运行结果
播放。。。 暂停。。。 倒带。。。