(17)コマンドモード
コマンドパターンとは、コマンドのカプセル化を指します。コマンドパターンは、リクエスターとレシーバーを分離します。リクエスターは、リクエストコマンドを実行するだけでよく、リクエストの実行方法や実行の有無を気にする必要はありません。
1.コマンドモードの設計原理
受信者:リクエストの特定の実装または実行。
コマンドロール(ICommand):実行する必要のあるすべてのコマンドを定義します。
具体的なコマンド(ConcreateCommand):Receiverを内部的に維持し、実行メソッドでReceiverの関連メソッドを呼び出します。
呼び出し元:コマンドを受信して実行します。
2.簡単な例
プレーヤーの再生機能、一時停止機能、停止機能はすべて、プレーヤー自体ではなく、プレーヤーコアに渡されるコントロールバーコマンドによって実行されます。
public class GPlayer {
// 这里模仿的是播放器内核我们的receiver,他能够直接执行相关指令
public void play(){
System.out.println("播放");
}
public void pause(){
System.out.println("暂停");
}
public void stop(){
System.out.println("停止");
}
}
public interface IAction {
void execute();
}
public class PlayAction implements IAction {
// 内部维护一个接收者对象
private GPlayer gPlayer;
// 构造方法
public PlayAction(GPlayer gPlayer){
this.gPlayer = gPlayer;
}
@Override
public void execute() {
gPlayer.play();
}
}
public class PauseAction implements IAction {
private GPlayer gPlayer;
public PauseAction(GPlayer gPlayer){
this.gPlayer = gPlayer;
}
@Override
public void execute() {
gPlayer.pause();
}
}
public class StopAction implements IAction {
private GPlayer gPlayer;
public StopAction(GPlayer gPlayer){
this.gPlayer = gPlayer;
}
@Override
public void execute() {
gPlayer.stop();
}
}
public class Controller {
// 即我们的invoker
private List<IAction> actionList = new ArrayList<>();
public void addAction(IAction action){
actionList.add(action);
}
public void execute(IAction action){
action.execute();
}
// 批量执行命令
public void executes(){
for(IAction action:actionList){
action.execute();
}
actionList.clear();
}
}
public class Client {
public static void main(String[] args) {
GPlayer gPlayer = new GPlayer();
Controller controller = new Controller();
controller.execute(new PlayAction(gPlayer));
controller.addAction(new PauseAction(gPlayer));
controller.addAction(new StopAction(gPlayer));
controller.executes();
}
}
3.コマンドモードに関するコメント
コマンドパターンの本質は、コマンドをカプセル化し、コマンドを発行する責任とコマンドを実行する責任を分離することです。
その他の参考資料:
https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/command.html