zoukankan      html  css  js  c++  java
  • 命令模式

    package com.tc.order;

     

     

    /**命令模式  就是发出命令的对象与执行命令的对象解耦。两者通过中介者传递,命令封装了接收者以及

     * 要执行的n个动作中介者不需要知道传递的对象信息。命令可以撤销,如下面的undo()

     * 命令接口

     */

    public interface Command {

    /**

    * 执行命令

    */

    public void execute();

    /**

    * 回滚操作

    */

    public void undo();

    }

     

    package com.tc.order;

     //要操作的对象

    public class Light {

    public void on() {

    System.out.println("the light is on.");

    }

     

    public void off() {

    System.out.println("the light is off.");

    }

    }

     

    package com.tc.order;

     //关灯操作命令

    public class LightOffCommand implements Command {

    private Light light;

     

    public LightOffCommand(Light light) {

    this.light = light;

    }

     

    @Override

    public void execute() {

    light.off();

    }

     

    @Override

    public void undo() {

    light.on();

    }

    }

     

    package com.tc.order;

     //开灯操作命令

    public class LightOnCommand implements Command {

    private Light light;

     

    public LightOnCommand(Light light) {

    this.light = light;

    }

     

    @Override

    public void execute() {

    light.on();

    }

     

    @Override

    public void undo() {

    light.off();

    }

    }

     

    package com.tc.order;

     

    import java.util.ArrayList;

    import java.util.List;

     

    /**

     * 遥控器类

     */

    public class RemoteControl {

    private List<Command> onCommands;

    private List<Command> offCommands;

    private Command undoCommand;

     

    public RemoteControl() {

    onCommands = new ArrayList<Command>();

    offCommands = new ArrayList<Command>();

    }

     

    public void setCommand(int index, Command onCommand, Command offCommand) {

    int size = onCommands.size();

    if (size == index) {

    onCommands.add(null);

    offCommands.add(null);

    } else if (size < index) {

    throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); 

    }

    onCommands.set(index, onCommand);

    offCommands.set(index, offCommand);

    }

     

    public void onButtonWasPushed(int index) {

    Command command = onCommands.get(index);

    command.execute();

    undoCommand = command;

    }

     

    public void offButtonWasPushed(int index) {

    Command command = offCommands.get(index);

    command.execute();

    undoCommand = command;

    }

     

    public void undoButtonWasPushed() {

    if (null == undoCommand) {

    throw new IllegalArgumentException("can not undo."); 

    }

    undoCommand.undo();

    }

    }

     

    package com.tc.order;

     //测试类

    public class Test1 {

    public static void main(String[] args) {

    Light light = new Light();

     

    LightOnCommand lightOnCommand = new LightOnCommand(light);

    LightOffCommand lightOffCommand = new LightOffCommand(light);

     

    RemoteControl remoteControl = new RemoteControl();

    remoteControl.setCommand(0, lightOnCommand, lightOffCommand);

    remoteControl.offButtonWasPushed(0);

     

    remoteControl.undoButtonWasPushed();

    }

    }

  • 相关阅读:
    A physically based scene with three.js
    pbr-guide
    Art Pipeline for glTF
    GG5D
    Leetcode 146.LRU缓存机制
    Leetcode 143.重排链表
    Leetcode 142.环形链表II
    Leetcode 141.环形链表
    Leetcode 139.单词拆分
    Leetcode 138.复制带随机指针的链表
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/5822735.html
Copyright © 2011-2022 走看看