一.小结
- 定义:将一个请求封装成一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
- 优点:1.降低了系统的耦合度 2.新的命令可以很容易添加到系统中去。
- 缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
- 使用场景:认为是命令模式的地方都可以使用命令模式。例如,在GUI开发中,一个按钮都一条命令。2.模拟CMD等。
- 通用UML如下
二.例子
生活中,带耳机听歌睡觉时,一般都更喜欢通过耳机去切歌、暂停等,这里来模拟这个场景
-
定义一个命令接口
public interface ICommand { void execute(); }
-
定义执行命令的接收者接口
public interface IReceiver { void action(); }
-
具体播放、暂停、上一曲、下一曲命令接收者
public class PlayReceiver implements IReceiver{ @Override public void action() { System.out.println("播放"); } } ... public class NextReceiver implements IReceiver{ @Override public void action() { System.out.println("下一曲"); } }
-
具体的命令
public class PlayCommand implements ICommand { PlayReceiver receiver; public PlayCommand() { receiver = new PlayReceiver(); } @Override public void execute() { receiver.action(); } } ... public class NextCommand implements ICommand { NextReceiver receiver; public NextCommand() { receiver = new NextReceiver(); } @Override public void execute() { receiver.action(); } }
-
封装调用者
public class Invoker { private ICommand command; public Invoker(ICommand command) { this.command = command; } public void execute() { command.execute(); } }
-
模拟情景
public class Client { public static void main(String[] args) { System.out.println("晚上十点半,上床听歌睡觉..."); // 随机来首歌 Invoker invoker = new Invoker(new PlayCommand()); invoker.execute(); // 不太喜欢,切下一曲 invoker = new Invoker(new NextCommand()); invoker.execute(); } }