命令模式
程序员文章站
2022-05-26 08:38:55
...
命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令模式涉及到五个角色,他们分别是:
- 客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
- 命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个Java接口或Java抽象类实现。
- 具体(ConcreteCommand)命令角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
- 请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
- 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
举个栗子:
假设电视机有三个操作:开机、关机和换台,可以将其看做是命令。电视机的遥控器相当于请求者(Invoker)的角色,操作者Sun相当于次系统的客户,电视机本身就是命令的接收者。代码如下:
操作者Sun类(客户角色):
package command;
public class Sun{
public static void main(String[] args) {
test();
}
private static void test() {
Tv myTv = new Tv();
OnCommand on = new OnCommand(myTv);
OffCommand off = new OffCommand(myTv);
ChannelCommand channel = new ChannelCommand(myTv, 2);
Control control = new Control(on,off,channel);
control.turnOn();
control.turnOff();
control.changeChannel();
}
}
遥控器Control类(请求者角色):
package command;
public class Control {
private Command onCommand,offCommand,changeChannel;
public Control(Command on, Command off, Command channel){
onCommand = on;
offCommand = off;
changeChannel = channel;
}
/**
* 行动方法
*/
public void turnOn(){
onCommand.execute();
}
/**
* 行动方法
*/
public void turnOff(){
offCommand.execute();
}
/**
* 行动方法
*/
public void changeChannel(){
changeChannel.execute();
}
}
命令角色(Command):
package command;
public interface Command {
void execute();
}
具体命令角色(ConcreteCommand):
开机OnCommand 类:
package command;
public class OnCommand implements Command {
private Tv myTv;
public OnCommand(Tv tv){
myTv = tv;
}
/**
* 执行方法
*/
@Override
public void execute() {
myTv.turnOn();
}
}
关机OffCommand 类:
package command;
public class OffCommand implements Command {
private Tv myTv;
public OffCommand(Tv tv){
myTv = tv;
}
/**
* 执行方法
*/
@Override
public void execute() {
myTv.turnOff();
}
}
换台ChannelCommand 类:
package command;
public class ChannelCommand implements Command {
private Tv myTv;
private int channel;
public ChannelCommand(Tv tv,int channel){
myTv = tv;
this.channel = channel;
}
/**
* 执行方法
*/
@Override
public void execute() {
myTv.changeChannel(channel);;
}
}
电视机本身Tv 类(接收者角色):
package command;
public class Tv {
private int currentChannel= 0;
/**
* 行动方法
*/
public void turnOn(){
System.out.println("The television is on.");
}
/**
* 行动方法
*/
public void turnOff(){
System.out.println("the television is off.");
}
/**
* 行动方法
*/
public void changeChannel(int channel){
currentChannel = channel;
System.out.println("Now TV channel is" + channel);
}
}
源码链接:命令模式代码demo,欢迎下载
上一篇: 永恒之蓝windows7 下的渗透测试
下一篇: Fastjson 反序列化漏洞复现