一、问题描述
电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮, 不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮 演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别 代表三种操作:打开电视机、关闭电视机和切换频道。显然,电视机遥 控器就是一个典型的命令模式应用实例。
参考类图:
二、主要代码:
public interface AbstractCommand {
void execute();
}
public abstract class Command {
public abstract void execute();
}
public class ConcreteCommand extends Command{
private Receiver receiver;
@Override
public void execute() {
receiver.action();
}
}
public class Controller {
private AbstractCommand openCommand,closeCommand,changeCommand;
public Controller(AbstractCommand openCommand,AbstractCommand closeCommand,AbstractCommand changeCommand) {
this.openCommand=openCommand;
this.closeCommand=closeCommand;
this.changeCommand=changeCommand;
}
public void open() {
openCommand.execute();
}
public void change() {
changeCommand.execute();
}
public void close() {
closeCommand.execute();
}
}
public class Invoker {
private Command command;
public Invoker(Command command){
this.command = command;
}
public void setCommand(Command command){
this.command = command;
}
public void call(){
command.execute();
}
}
public class Receiver {
public void action(){
}
}
public class Television
{
public void open() {
System.out.println("----------打--开--电--视--机----------");
}
public void close() {
System.out.println("----------关--闭--电--视--机----------");
}
public void changeChannel() {
System.out.println("----------更--改--频--道----------");
}
}
public class TVChangeCommand implements AbstractCommand{
private Television tv;
public TVChangeCommand(){
tv = new Television();
}
@Override
public void execute() {
tv.changeChannel();//更改频道
}
}
public class TVCloseCommand implements AbstractCommand{
private Television tv;
public TVCloseCommand(){
tv = new Television();
}
@Override
public void execute() {
tv.close();//关闭电视机
}
}
public class TVOpenCommand implements AbstractCommand{
private Television tv;
public TVOpenCommand(){
tv = new Television();
}
@Override
public void execute() {
tv.open();//打开电视机
}
}
测试类:
public class Client {
public static void main(String[] args) {
AbstractCommand openCommand,closeCommand,changeCommand;
openCommand = new TVOpenCommand();
closeCommand = new TVCloseCommand();
changeCommand = new TVChangeCommand();
Controller control = new Controller(openCommand,closeCommand,changeCommand);
control.open();
control.change();
control.close();
}
}
三、运行结果: