行为型设计模式之命令模式
Posted 丨Jack_Chen丨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为型设计模式之命令模式相关的知识,希望对你有一定的参考价值。
@TOC
命令模式
应用场景
适用场景:
1、只要认为是命令的地方都可以使用命令模式
2、请求调用者和请求的接收者需要解耦,使得调用者和接收者不直接交互
3、需要抽象出等待执行的行为,比如播放操作、暂定操作等
4、需要支持命令宏,即命令组合操作
生活中的应用场景比如:遥控器,播放器,点餐系统。
优缺点
优点:
1.通过引入中间件(抽象接口),解耦了命令请求与实现。
2.扩展性良好,可以很容易地增加新命令。
3.支持组合命令,支持命令队列。
4.可以在现有命令的基础上,增加额外功能。
缺点:
1.具体命令类可能过多。
2.命令模式的结果其实就是接收方的执行结果,但是为了以命令的形式进行架构,解耦请求与实现,引入了额外类型结构,增加了理解上的困难
主要角色
1.接收者角色(Receiver)
2.命令角色(Command)
3.具体命令角色ConcreteCommand)
4.请求者角色(Invoker)
命令模式的基本使用
创建接收者角色
接收者角色负责具体实施或执行一个请求。
public class Receiver
public void action()
System.out.println("接收者Receiver执行action操作");
创建命令角色
命令角色定义需要执行的所有命令行为,它作为接收者角色和请求者角色的中间件,解耦彼此。
public interface ICommand
void execute();
具体命令角色
具体命令角色内部维护一个接收者Receiver,在其execute()方法中调用接收者Receiver的相关方法。
public class ConcreteCommand implements ICommand
// 直接创建接收者,不暴露给客户端
private Receiver mReceiver = new Receiver();
public void execute()
this.mReceiver.action();
请求者角色
请求者角色接收客户端的命令,并执行命令。
public class Invoker
private ICommand mCmd;
public Invoker(ICommand cmd)
this.mCmd = cmd;
public void action()
this.mCmd.execute();
客户端执行
public static void main(String[] args)
ICommand cmd = new ConcreteCommand();
Invoker invoker = new Invoker(cmd);
invoker.action();
接收者Receiver执行action操作
命令模式实现播放器功能
创建接收者角色
public class Player
public void play()
System.out.println("执行播放操作");
public void stop()
System.out.println("执行暂停播放操作");
创建命令角色
public interface IAction
void execute();
具体命令角色
创建播放器可以接受的播放指令
public class PlayAction implements IAction
// 直接创建接收者,不暴露给客户端
private Player player;
public PlayAction(Player player)
this.player = player;
public void execute()
player.play();
创建播放器可以接受的暂停指令
public class StopAction implements IAction
private Player player;
public StopAction(Player player)
this.player = player;
public void execute()
player.stop();
创建请求者角色
创建控制器,类似控制面板,执行上面提供的功能即可。如此控制器就与播放器进行解耦了,如新增指令则执行新增命令即可,无需修改控制器。
public class Controller
private List<IAction> actions = new ArrayList<IAction>();
public void addAction(IAction action)
actions.add(action);
public void execute(IAction action)
action.execute();
public void executes()
for (IAction action : actions)
action.execute();
actions.clear();
客户端执行
public static void main(String[] args)
// 创建一个播放器
Player player = new Player();
Controller controller = new Controller();
// 单个命令执行
controller.execute(new StopAction(player));
System.out.println("------------------");
// 批量执行命令
controller.execute(new PlayAction(player));
controller.addAction(new StopAction(player));
controller.executes();
执行暂停播放操作
------------------
执行播放操作
执行暂停播放操作
以上是关于行为型设计模式之命令模式的主要内容,如果未能解决你的问题,请参考以下文章