1.代码实例:
package tv;
//执行命令的接口
public interface Command {
void execute();
}
package tv;
//开机命令ConcreteCommand
public class CommandOn implements Command {
private Tv tv;
public CommandOn(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOn();
}
}
package tv;
//切换频道命令ConcreteCommand
public class CommandChanges implements Command {
private Tv tv;
private int channel;
public CommandChanges(Tv tv, int channel) {
this.tv = tv;
this.channel = channel;
}
@Override
public void execute() {
tv.changeChannel(channel);
}
}
package tv;
//关机命令ConcreteCommand
public class CommandOff implements Command {
private Tv tv;
public CommandOff(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOff();
}
}
package tv;
//遥控器 Invoker
public class Control {
private Command onCommand, offCommand, changeChannel;
public Control(Command on,Command off, Command change) {
onCommand = on;
offCommand = off;
changeChannel = change;
}
public void turnOn() {
onCommand.execute();
}
public void turnOff() {
offCommand.execute();
}
public void changeChannel() {
changeChannel.execute();
}
}
package tv;
//测试类 Client
public class Client {
public static void main(String[] args) {
//命令接收者Receiver
Tv tv = new Tv();
//开机命令ConcreteCommand
Command onCommand = new CommandOn(tv);
//关机命令ConcreteCommand
Command offCommand = new CommandOff(tv);
//切换命令ConcreteCommand
Command changeCommand = new CommandChanges(tv, 5);
//命令控制Invoker
Control control = new Control(onCommand, offCommand, changeCommand);
//开机
control.turnOn();
//切换
control.changeChannel();
//关机
control.turnOff();
}
}
2.概念
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
3.命令模式设计到哪些角色
(1)命令角色Command:声明执行操作的接口
(2)具体命令角色ConcreteCommand:将一个接收者对象绑定于一个动作,调用接收者相应的操作,用以实现命令角色声明的执行操作的接口
(3)客户角色Client: 创建一个具体命令对象
(4)请求者角色Invoker:调用命令对象执行这个请求
(5)接收者角色Receiver:
4. 优缺点
(1) 将调用操作的请求对象与知道如何实现该操作的接收者对象解耦
(2)具体命令角色可以被不同的请求者角色重用
(3) 可以将多个命令装配成一个复合命令
(4) 便于增加新的具体命令角色
5.例子
//命令角色Command
public interface Command {
void execute();
}
//具体命令角色ConcreteCommand
public class ConcreteCommandOne implements Command {
private Receiver receiver;
public ConcreteCommandOne(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
this.receiver.actionOne();
}
}
//具体命令角色ConcreteCommand
public class ConcreteCommandTwo implements Command {
private Receiver receiver;
public ConcreteCommandTwo(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
this.receiver.actionTwo();
}
}
//接收者角色Receiver
public class Receiver {
public Receiver() {
}
public void actionOne() {
System.out.println("ActionOne has been taken");
}
public void actionTwo() {
System.out.println("ActionTwo has been taken");
}
}
//请求者角色
public class Invoker {
private Command ConcreteCommandOne;
private Command ConcreteCommandTwo;
public Invoker(Command ConcreteCommandOne, Command ConcreteCommandTwo) {
this.ConcreteCommandOne = ConcreteCommandOne;
this.ConcreteCommandTwo = ConcreteCommandTwo;
}
public void actionOne() {
this.ConcreteCommandOne.execute();
}
public void actionTwo() {
this.ConcreteCommandTwo.execute();
}
}
//客户角色
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command commandOne = new ConcreteCommandOne(receiver);
Command commandTwo = new ConcreteCommandTwo(receiver);
Invoker invoker = new Invoker(commandOne, commandTwo);
invoker.actionOne();
invoker.actionTwo();
}
}
6命令模式与其他模式配合使用
(1) 代理模式
(2) 有个固定命令组合会被多次执行 组合模式
(3) 需要redo undo 备忘录模式
(4) 命令很多类似地方 原型模式 clone