命令模式---是谁拿了我的遥控器

        声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值