一.简介
我们在给使用遥控器给控制电视的时候,这种方式正符合了我们java中的命令设计模式,我们自己就是客户端,电视代表了接收者,它会执行具体的动作,整个遥控器是调用者,具体按键开机,关机,变化频道是具体的命令类.
二.结构
- 抽象命令角色:它定义了具体命令者的统一的接口,该接口中的方法由调用者来统一调用.
- 具体命令角色:实现了抽象命令角色,引入了接收者,使用接收者做具体的命令操作.
- 抽象接收者角色:定义了具体接收者的基层接口.
- 具体接受者的角色:实现了首相接收者角色,实现了执行命令的具体逻辑.
- 调用者:一个具体类,引入了命令角色,调用命令角色的方法.
类图
三.代码
package command;
/**
* Created by ZouHaiBo on 2018/1/31.
* 命令模式
*
* 遥控器 --- 具体按键 -- 电视 ----- 人
* | | | |
* | | | |
* 调用者---- 命令类-----接受者-----客户端
*
*/
// 抽象命令类
interface Command {
void command();
}
// 开机命令
class OnCommand implements Command{
private Reciver reciver;
public OnCommand(Reciver reciver) {
this.reciver = reciver;
}
@Override
public void command() {
reciver.on();
}
}
// 关机命令
class OffCommand implements Command{
private Reciver reciver;
public OffCommand(Reciver reciver) {
this.reciver = reciver;
}
@Override
public void command() {
reciver.off();
}
}
// 抽象接受者
interface Reciver {
void on();
void off();
}
// 具体接受者
class DianShiReciver implements Reciver{
@Override
public void on() {
System.out.println("开机");
}
@Override
public void off() {
System.out.println("关机");
}
}
// 调用者
class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void excute() {
command.command();
}
}
public class Client {
public static void main(String[] args) {
Invoker invoker = new Invoker();
invoker.setCommand(new OnCommand(new DianShiReciver()));
invoker.excute();
invoker.setCommand(new OffCommand(new DianShiReciver()));
invoker.excute();
}
}
四.特点
- 调用操作的人和接收者(也就是具体的执行者)解耦合;
- 添加新的命令简单;
- 客户端很方便就可以使用复合命令进行操作;
- 具体命令者角色可以被不同的请求者角色重用.
五.使用场景
- 需要抽象出待执行的操作,然后以参数的形式提供出来;
- 在不同的时刻指定,排列不同的指令;
- 需要支持取消操作;
- 需要支持日志功能;
- 需要支持事物操作;
六.参考文献
大话设计模式