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

浙公网安备 33010602011771号