白话-23种设计模式16-命令模式
【摘要】 一、白话 看电视时,我们都是通过遥控机来操作电视,如开机,关机,换台。这就是对命令模式的一种使用。二、定义 命令模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。● Receive接收者角色:该角色就是干活的角色,命令传递到这里是应该被执行的,具体到我们上面的例子中就是Group的三个实现类。● Comm...
一、白话
看电视时,我们都是通过遥控机来操作电视,如开机,关机,换台。这就是对命令模式的一种使用。
二、定义
命令模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
● Receive接收者角色:该角色就是干活的角色,命令传递到这里是应该被执行的,具体到我们上面的例子中就是Group的三个实现类。
● Command命令角色:需要执行的所有命令都在这里声明。
● Invoker调用者角色:接收到命令,并执行命令
三、示例
// 抽象接受者-统一所有接受者需要的实现的细节
public interface Receive {
public void turnOn();
public void turnOff();
}
// 具体接收者 - 电视
public class TV implements Receive {
@Override
public void turnOn() {
System.out.println("电视开机");
}
@Override
public void turnOff() {
System.out.println("电视关机");
}
}
// 抽象命令角色-所有具体命令共同接口
public interface Command {
void execute();
}
// 具体命令角色-关机命令
public class TurnOffCommand implements Command {
Receive receive;
public TurnOffCommand(Receive receive) {
this.receive = receive;
}
@Override
public void execute() {
receive.turnOff();
}
}
// 具体命令角色-开机命令
public class TurnOnCommand implements Command {
Receive receive;
public TurnOnCommand(Receive receive) {
this.receive = receive;
}
@Override
public void execute() {
receive.turnOn();
}
}
// 调用者角色-接收命令,并执行命令 遥控板
public class Invoker {
// 命令
List<Command> commands = new ArrayList<>();
// 接收命令
public void addCommand(Command command){
commands.add(command);
}
// 执行命令
public void action(){
for (Command command : commands) {
command.execute();
}
}
}
public class CommandApplication {
// 客户端调用
public static void main(String[] args) {
// 新增调用者
Invoker invoker = new Invoker();
// 新增接收者
Receive tv = new TV();
// 新增命令 并绑定接受者
Command turnOnCommand = new TurnOnCommand(tv);
Command turnOffCommand = new TurnOffCommand(tv);
// 调用者 接收命令 并 执行命令
invoker.addCommand(turnOnCommand);
invoker.addCommand(turnOffCommand);
invoker.action();
}
}
输出示例:
电视开机
电视关机
四、总结
特点:降低了系统耦合度。新的命令可以添加到系统中去。容易导致具体命令类过多。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)