声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我QQ群:425120333
随着科技的进步,电视机已经成为每个家庭的基本电器用品。现在家里的电视都用遥控器来控制电视机,但是当遥控器坏了的时候,
就只能通过操作电视机上的按钮来达到操作电视机的目标,这是人的每个请求都要通过直接对电视机发布指令(按下相应的按钮),来完成操作。
这里就出现了问题,人对电视机的依赖太强了,必须亲自操作电视机本身,用专业的术语就是人和电视机的耦合太强。想想,大冬天晚上,
换个台还要从被窝里跑出来,如果是这样我宁愿不看。所以这时候遥控器就派上用场了,人可以将对电视机的指令通过向遥控器传达,
通过遥控器来控制电视机的操作。这样一来,就可以使得人和电视机解耦,不会产生依赖。
public class WatchingTV {
public static void main(String[] args) {
//声明遥控器
RemoteControl control = new RemoteControl();
//声明开机指令
Command turnOnCommand = new TurnOnCommand();
//通过遥控器发指令
control.setCommand(turnOnCommand);
control.control();
//声明换台指令
Command changeChannelCommand = new ChangeChannelCommand();
//通过遥控器发指令
control.setCommand(changeChannelCommand);
control.control();
//声明调节音量指令
Command adjustVoiceCommand = new AdjustVoiceCommand();
//通过遥控器发指令
control.setCommand(adjustVoiceCommand);
control.control();
//声明关机指令
Command turnOffCommand = new TurnOffCommand();
//通过遥控器发指令
control.setCommand(turnOffCommand);
control.control();
}
}
/**
* @introduce:电视机类
*
*/
class TV {
void turnOn() {
System.out.println("打开电视机");
}
void turnOff() {
System.out.println("关闭电视机");
}
void changeChannel() {
System.out.println("换台");
}
void adjustVoice() {
System.out.println("调节音量");
}
}
/**
* @introduce:指令抽象类
*
*/
abstract class Command {
TV tv = new TV();
abstract void execute();
}
class TurnOnCommand extends Command {
@Override
void execute() {
tv.turnOn();
}
}
class TurnOffCommand extends Command {
@Override
void execute() {
tv.turnOff();
}
}
class ChangeChannelCommand extends Command {
@Override
void execute() {
tv.changeChannel();
}
}
class AdjustVoiceCommand extends Command {
@Override
void execute() {
tv.adjustVoice();
}
}
/**
* @introduce:空指令
*
*/
class NoActionCommand extends Command {
@Override
void execute() {
}
}
/**
* @introduce:遥控器类
*
*/
class RemoteControl {
private Command command = new NoActionCommand();
public void setCommand(Command command) {
this.command = command;
}
public void control() {
command.execute();
}
}
控制台输出:
打开电视机
换台
调节音量
关闭电视机
通过将每个指令声明为相应的命令,并通过遥控器将相应的命令传达给电视机,这就是命令模式,使得命令的请求者(人,这里没声明该类,不过是这个意思)
和命令的执行者(电视)解耦。人只要传达命令,而不用关心命令是怎么执行的,是给谁执行的,这些都是遥控器控制的。这里用了个小技巧,
在声明命令时同时声明了一个无行为命令(NoAction类)为了是避免 new遥控器类时忘了调setCommand方法,直接调用execute方法而出现的空指针异常。
参考大牛博客:http://www.cnblogs.com/zuoxiaolong/p/pattern13.html