<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    合工大很牛很牛牛

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      14 Posts :: 1 Stories :: 37 Comments :: 0 Trackbacks

    Command Pattern的目的在于分離命令的發(fā)出者和命令的執(zhí)行者。就好比在飯店吃飯,作為客戶(命令的發(fā)出者),你無(wú)需直接跟廚師說(shuō)明要點(diǎn)什么菜,只要把菜單給服務(wù)員就行了,而服務(wù)員并不負(fù)責(zé)燒菜,只要把菜單交給廚師(執(zhí)行者)即可,廚師會(huì)根據(jù)菜單做菜了。這兩者被分離了。

     

    下面來(lái)實(shí)現(xiàn)這個(gè)點(diǎn)菜的過(guò)程:我們要點(diǎn)兩個(gè)菜,burgermalt。最簡(jiǎn)單的實(shí)現(xiàn)如下:

    package javaapplication29;

     

    public class Main {

        public static void main(String[] args) {

            Cook cook = new Cook();

            cook.burger();

            cook.malt();

        }

    }

     

    class Cook {

        void burger() {

            System.out.println("burger maked");

        }

        void malt() {

            System.out.println("malt maked");

        }

    }

     

    這里有個(gè)問(wèn)題:我們要點(diǎn)什么菜,是寫(xiě)在主函數(shù)里的。如果要點(diǎn)的菜有所改變,比如第二個(gè)人要點(diǎn)菜,點(diǎn)其他菜,那么主函數(shù)里的代碼就要重寫(xiě)。這里就出現(xiàn)了所謂的“變化沒(méi)有被封裝”的問(wèn)題。這里的代碼實(shí)現(xiàn)過(guò)程就好比顧客直接跟廚師說(shuō)要吃什么菜一樣。

     

    這里我們引入“菜單”,所謂菜單的作用在于:把變化的“點(diǎn)什么菜”封裝到菜單這個(gè)對(duì)象里面去。實(shí)際上就是把主函數(shù)中變化的部分封裝到一個(gè)類(lèi)中去了。

    package javaapplication29;

     

    public class Main {

        public static void main(String[] args) {

            Cook cook = new Cook();

            Manu1 manu1 = new Manu1(cook);

            manu1.orderup();

        }

    }

     

    class Cook {

        void burger() {

            System.out.println("burger maked");

        }

        void malt() {

            System.out.println("malt maked");

        }

    }

     

    class Manu1 {

        Cook cook;

        public Manu1(Cook cook) {

            this.cook = cook;

        }

        public void orderup() {

            cook.burger();

            cook.malt();

        }

    }

     

     

    如果有第二個(gè)菜單,我們就再寫(xiě)第二個(gè)類(lèi)Manu2出來(lái):

    package javaapplication29;

     

    public class Main {

        public static void main(String[] args) {

            Cook cook = new Cook();

            Manu1 manu1 = new Manu1(cook);

            manu1.orderup();

           

            Manu2 manu2=new Manu2(cook);

            manu2.orderup();

        }

    }

     

    class Cook {

        void burger() {

            System.out.println("burger maked");

        }

        void malt() {

            System.out.println("malt maked");

        }

    }

     

    class Manu1 {

        Cook cook;

        public Manu1(Cook cook) {

            this.cook = cook;

        }

        public void orderup() {

            cook.burger();

            cook.malt();

        }

    }

     

    class Manu2 {

        Cook cook;

        public Manu2(Cook cook) {

            this.cook = cook;

        }

        public void orderup() {

            cook.burger();

        }

    }

              

    這里我們發(fā)現(xiàn)Manu1Manu2兩個(gè)類(lèi)形式幾乎相通,只是orderup()函數(shù)內(nèi)執(zhí)行的東西不一樣。在主函數(shù)中,要執(zhí)行第二個(gè)菜單還得重新生成一個(gè)對(duì)象,Manu2 manu2=new Manu2(cook);  而不能直接切換,manu1=new Manu2(cook);   這很不爽,由此很容易想到用一個(gè)父類(lèi),讓Manu1Manu2繼承之,如下:

     

    package javaapplication29;

     

    public class Main {

        public static void main(String[] args) {

            Cook cook = new Cook();

            Manu manu = new Manu1(cook);

            manu.orderup();

     

            manu = new Manu2(cook);

            manu.orderup();

        }

    }

     

    class Cook {

        void burger() {

            System.out.println("burger maked");

        }

        void malt() {

            System.out.println("malt maked");

        }

    }

     

    abstract class Manu {

        abstract public void orderup();

    }

     

    class Manu1 extends Manu {

        Cook cook;

        public Manu1(Cook cook) {

            this.cook = cook;

        }

        public void orderup() {

            cook.burger();

            cook.malt();

        }

    }

     

    class Manu2 extends Manu {

        Cook cook;

        public Manu2(Cook cook) {

            this.cook = cook;

        }

        public void orderup() {

            cook.burger();

        }

    }

     

    這個(gè)實(shí)際上變成工廠模式了。我們看到主函數(shù)中:

    Manu manu = new Manu1(cook);

    manu.orderup();

    這里,命令的發(fā)出是通過(guò)菜單的orderup方法發(fā)出的。可實(shí)際中,菜單是不能發(fā)命令的,而是客戶通過(guò)服務(wù)員發(fā)命令的。我們需要一個(gè)Waitress這個(gè)對(duì)象來(lái)裝載各種菜單,并對(duì)廚師發(fā)出點(diǎn)菜的命令(通過(guò)調(diào)用Manuorderup方法)。如下:

     

    package javaapplication29;

     

    public class Main {

        public static void main(String[] args) {

            Cook cook = new Cook();

            Waitress waitress = new Waitress();

     

            Manu manu = new Manu1(cook);

            waitress.setManu(manu);

            waitress.callCook();

     

            manu = new Manu2(cook);

            waitress.setManu(manu);

            waitress.callCook();

        }

    }

     

    class Cook {

        void burger() {

            System.out.println("burger maked");

        }

        void malt() {

            System.out.println("malt maked");

        }

    }

     

    abstract class Manu {

        abstract public void orderup();

    }

     

    class Manu1 extends Manu {

        Cook cook;

        public Manu1(Cook cook) {

            this.cook = cook;

        }

        public void orderup() {

            cook.burger();

            cook.malt();

        }

    }

     

    class Manu2 extends Manu {

        Cook cook;

        public Manu2(Cook cook) {

            this.cook = cook;

        }

        public void orderup() {

            cook.burger();

        }

    }

     

    class Waitress {

        Manu manu;

        public void setManu(Manu manu) {

            this.manu = manu;

        }

        public void callCook() {

            manu.orderup();

        }

    }

    在這個(gè)程序里,我們發(fā)現(xiàn)其實(shí)Waitress在主程序中只知道要callCook()

    waitress.callCook();

    而她并不知道callCook()在具體執(zhí)行什么,因?yàn)?/span>Waitress類(lèi)中的manu是一個(gè)抽象類(lèi)的對(duì)象,而callCook()方法中的manu.orderup() 是抽象方法,鬼知道它的具體實(shí)現(xiàn)是什么。

     

    這就是Command Pattern的目的:把命令封裝成對(duì)象(Manu1Manu2),讓調(diào)用命令的人(Waitress)裝載該對(duì)象(setManu),隨時(shí)可以發(fā)出該命令(callCook)。而調(diào)用命令的人,并不知道該命令的具體執(zhí)行過(guò)程。

     

    這有點(diǎn)類(lèi)似于給工廠模式中的抽象工廠添加了一個(gè)裝載器。值得注意的是,在工廠模式中,頂層的抽象工廠一般是抽象類(lèi),而在命令模式中,頂層的一般都是接口。其實(shí)到底用抽象類(lèi)還是接口并不重要!因?yàn)樵谀撤N程度上,他們都是Interface。到底用哪個(gè),根據(jù)需要使用,畢竟可以實(shí)現(xiàn)多接口而不能繼承多個(gè)抽象類(lèi)。Command Pattern的關(guān)鍵不在于這里,而在于裝載器和工廠模式的結(jié)合。

     

    head first design pattern》上要實(shí)現(xiàn)一個(gè)遠(yuǎn)程控制器,思路跟上面一樣。代碼如下所示:

    package javaapplication30;

     

    public class Main {

        public static void main(String[] args) {

            Light light = new Light();

            Command command = new LightOnCommand(light);

            RemoteControl rc = new RemoteControl();

            rc.setControl(command);

            rc.ButtonDown();

     

            GarageDoor garageDoor = new GarageDoor();

            command = new GarageDoorOpenCommand(garageDoor);

            rc.setControl(command);

            rc.ButtonDown();

        }

    }

     

    class Light {

        public void on() {

            System.out.println("turn Light on.");

        }

    }

     

    class GarageDoor {

        public void open() {

            System.out.println("open GarageDoor");

        }

    }

     

    interface Command {

        public void execute();

    }

     

    class LightOnCommand implements Command {

        Light light;

        LightOnCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.on();

        }

    }

     

    class GarageDoorOpenCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorOpenCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.open();

        }

    }

     

    class RemoteControl {

        Command command;

        public void setControl(Command command) {

            this.command = command;

        }

        public void ButtonDown() {

            command.execute();

        }

    }

     

     

    以上設(shè)計(jì)出的遠(yuǎn)程控制器只有一個(gè)slot,對(duì)應(yīng)一個(gè)按鈕。現(xiàn)在如果要實(shí)現(xiàn)7個(gè)slot,每個(gè)slot對(duì)應(yīng)一個(gè)“打開(kāi)”按鈕,則需要把RemoteControl這個(gè)類(lèi)改動(dòng)一下:

     

    package javaapplication30;

     

    public class Main {

        public static void main(String[] args) {

            Light light = new Light();

            GarageDoor garageDoor = new GarageDoor();

            RemoteControl rc = new RemoteControl();

     

            Command command = new LightOnCommand(light);

            rc.setControl(0, command);

     

            command = new GarageDoorOpenCommand(garageDoor);

            rc.setControl(1, command);

     

            rc.buttonDown(0);

            rc.buttonDown(1);

        }

    }

     

    class Light {

        public void on() {

            System.out.println("turn Light on.");

        }

    }

     

    class GarageDoor {

        public void open() {

            System.out.println("open GarageDoor");

        }

    }

     

    interface Command {

        public void execute();

    }

     

    class noCommand implements Command {

        public void execute() {

            System.out.println("no command here.");

        }

    }

     

    class LightOnCommand implements Command {

        Light light;

        LightOnCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.on();

        }

    }

     

    class GarageDoorOpenCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorOpenCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.open();

        }

    }

     

    class RemoteControl {

        Command[] onCommands;

    Command noCommand = new noCommand();

     

        public RemoteControl() {

            onCommands = new Command[7];

            for (int i = 0; i < 7; i++) {

                onCommands[i] = noCommand; //初始化7個(gè)槽對(duì)應(yīng)的按鈕指令為空

            }

        }

        public void setControl(int slot, Command command) {

            onCommands[slot] = command;

        }

        public void buttonDown(int slot) {

            onCommands[slot].execute();

        }

    }

     

    對(duì)比之前的只有一個(gè)slot的程序,RemoteControl類(lèi)添加了一個(gè)初始化作用的構(gòu)造函數(shù),并在每個(gè)方法的參數(shù)表里添加了slot參數(shù)。

     

    如果想要有7個(gè)slot,每個(gè)slot都對(duì)應(yīng)“開(kāi)”、“關(guān)”兩個(gè)按鈕,則同理,講RemoteControl中的參數(shù)再各增加一個(gè)即可,如下:

    package javaapplication30;

     

    public class Main {

        public static void main(String[] args) {

            Light light = new Light();

            GarageDoor garageDoor = new GarageDoor();

            RemoteControl rc = new RemoteControl();

     

            Command onCommand = new LightOnCommand(light);

            Command offCommand = new LightOffCommand(light);

            rc.setControl(0, onCommand, offCommand);

     

            onCommand = new GarageDoorOpenCommand(garageDoor);

            offCommand = new GarageDoorCloseCommand(garageDoor);

            rc.setControl(1, onCommand, offCommand);

     

            rc.onButtonDown(0);

            rc.offButtonDown(1);

            rc.offButtonDown(0);

            rc.onButtonDown(1);

        }

    }

     

    class Light {

        public void on() {

            System.out.println("turn Light on.");

        }

        void off() {

            System.out.println("turn light off");

        }

    }

     

    class GarageDoor {

        public void open() {

            System.out.println("open GarageDoor");

        }

        public void close() {

            System.out.println("close GarageDoor");

        }

    }

     

    interface Command {

        public void execute();

    }

     

    class noCommand implements Command {

        public void execute() {

            System.out.println("no command here.");

        }

    }

     

    class LightOnCommand implements Command {

        Light light;

        LightOnCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.on();

        }

    }

     

    class LightOffCommand implements Command {

        Light light;

        LightOffCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.off();

        }

    }

     

    class GarageDoorOpenCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorOpenCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.open();

        }

    }

     

    class GarageDoorCloseCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorCloseCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.close();

        }

    }

     

    class RemoteControl {

        Command[] onCommands;

    Command[] offCommands;

    Command noCommand = new noCommand();

     

        public RemoteControl() {

            onCommands = new Command[7];

            offCommands = new Command[7];

            for (int i = 0; i < 7; i++) {

                onCommands[i] = noCommand;

                offCommands[i] = noCommand;

            }

        }

        public void setControl(int slot, Command onCommand, Command offCommand) {

            onCommands[slot] = onCommand;

            offCommands[slot] = offCommand;

        }

        public void onButtonDown(int slot) {

            onCommands[slot].execute();

        }

        public void offButtonDown(int slot) {

            offCommands[slot].execute();

        }

    }

     

     

    如何給上面的程序添加一個(gè)undo按鈕呢,就是撤銷(xiāo)上一次的操作。

    (1)       我們要給Command接口以及它的所有實(shí)現(xiàn)體(LightOnCommand, GarageCloseCommand等)添加undo()方法,undo執(zhí)行的內(nèi)容就是和execute()執(zhí)行相反的即可。

    (2)       我們還在RemoteControl類(lèi)中,想辦法記錄最后一次執(zhí)行的是哪個(gè)XXXCommand

     

    實(shí)現(xiàn)如下:

    package javaapplication30;

     

    public class Main {

        public static void main(String[] args) {

            Light light = new Light();

            GarageDoor garageDoor = new GarageDoor();

            RemoteControl rc = new RemoteControl();

     

            Command onCommand = new LightOnCommand(light);

            Command offCommand = new LightOffCommand(light);

            rc.setControl(0, onCommand, offCommand);

     

            onCommand = new GarageDoorOpenCommand(garageDoor);

            offCommand = new GarageDoorCloseCommand(garageDoor);

            rc.setControl(1, onCommand, offCommand);

     

            rc.onButtonDown(0);

            rc.undoButtonDown();

            rc.offButtonDown(1);

            rc.offButtonDown(0);

            rc.onButtonDown(1);

            rc.undoButtonDown();

        }

    }

     

    class Light {

        public void on() {

            System.out.println("turn Light on.");

        }

        void off() {

            System.out.println("turn light off");

        }

    }

     

    class GarageDoor {

        public void open() {

            System.out.println("open GarageDoor");

        }

        public void close() {

            System.out.println("close GarageDoor");

        }

    }

     

    interface Command {

        public void execute();

        public void undo();

    }

     

    class noCommand implements Command {

        public void execute() {

            System.out.println("no command here.");

        }

        public void undo() {

            System.out.println("no command here.");

        }

    }

     

    class LightOnCommand implements Command {

        Light light;

        LightOnCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.on();

        }

        public void undo() {

            light.off();

        }

    }

     

    class LightOffCommand implements Command {

        Light light;

        LightOffCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.off();

        }

        public void undo() {

            light.on();

        }

    }

     

    class GarageDoorOpenCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorOpenCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.open();

        }

        public void undo() {

            garageDoor.close();

        }

    }

     

    class GarageDoorCloseCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorCloseCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.close();

        }

        public void undo() {

            garageDoor.open();

        }

    }

     

    class RemoteControl {

        Command[] onCommands;

        Command[] offCommands;

        Command noCommand = new noCommand();

        Command lastCommand;

        public RemoteControl() {

            onCommands = new Command[7];

            offCommands = new Command[7];

            for (int i = 0; i < 7; i++) {

                onCommands[i] = noCommand;

                offCommands[i] = noCommand;

            }

        }

        public void setControl(int slot, Command onCommand, Command offCommand) {

            onCommands[slot] = onCommand;

            offCommands[slot] = offCommand;

        }

        public void onButtonDown(int slot) {

            onCommands[slot].execute();

            lastCommand = onCommands[slot];

        }

        public void offButtonDown(int slot) {

            offCommands[slot].execute();

            lastCommand = offCommands[slot];

        }

        public void undoButtonDown() {

            lastCommand.undo();

        }

    }

     

    電器的功能可能不止“開(kāi)”和“關(guān)”,比如電風(fēng)扇,有換擋功能。對(duì)于電風(fēng)扇的HighMediumLow三個(gè)檔位,每個(gè)要寫(xiě)一個(gè)單獨(dú)的FanXXXCommand類(lèi)。對(duì)每個(gè)檔位做undo的時(shí)候,不能直接簡(jiǎn)單的取反,要找到上一次的檔位才行。

     

    package javaapplication30;

     

    public class Main {

        public static void main(String[] args) {

            Light light = new Light();

            GarageDoor garageDoor = new GarageDoor();

            RemoteControl rc = new RemoteControl();

     

            Command onCommand = new LightOnCommand(light);

            Command offCommand = new LightOffCommand(light);

            rc.setControl(0, onCommand, offCommand);

     

            onCommand = new GarageDoorOpenCommand(garageDoor);

            offCommand = new GarageDoorCloseCommand(garageDoor);

            rc.setControl(1, onCommand, offCommand);

     

            rc.onButtonDown(0);

            rc.undoButtonDown();

            rc.offButtonDown(1);

            rc.offButtonDown(0);

            rc.onButtonDown(1);

            rc.undoButtonDown();

     

            Fan fan = new Fan();

            onCommand = new FanHighCommand(fan);

            offCommand = new FanOffCommand(fan);

            rc.setControl(2, onCommand, offCommand);

            rc.onButtonDown(2);

            rc.offButtonDown(2);

            rc.undoButtonDown();

        }

    }

     

    class Light {

        public void on() {

            System.out.println("turn Light on.");

        }

        void off() {

            System.out.println("turn light off");

        }

    }

     

    class GarageDoor {

        public void open() {

            System.out.println("open GarageDoor");

        }

        public void close() {

            System.out.println("close GarageDoor");

        }

    }

     

    class Fan {

        public final int HIGH = 3;

        public final int MEDIUM = 2;

        public final int LOW = 1;

        public final int OFF = 0;

        public int speed = 0;

        public void high() {

            speed = HIGH;

            System.out.println("Fan's speed is " + speed);

        }

        public void low() {

            speed = LOW;

            System.out.println("Fan's speed is " + speed);

        }

        public void medium() {

            speed = MEDIUM;

            System.out.println("Fan's speed is " + speed);

        }

        public void off() {

            speed = OFF;

            System.out.println("Fan's speed is " + speed);

        }

        public int getSpeed() {

            return speed;

        }

    }

     

    interface Command {

        public void execute();

        public void undo();

    }

     

    class noCommand implements Command {

        public void execute() {

            System.out.println("no command here.");

        }

        public void undo() {

            System.out.println("no command here.");

        }

    }

     

    class FanHighCommand implements Command {

        Fan fan;

        int preSpeed;

        FanHighCommand(Fan fan) {

            this.fan = fan;

        }

        public void execute() {

            preSpeed = fan.getSpeed();

            fan.high();

        }

        public void undo() {

            if (preSpeed == fan.HIGH) {

                fan.high();

            }

            else if (preSpeed == fan.MEDIUM) {

                fan.medium();

            }

            else if (preSpeed == fan.LOW) {

                fan.low();

            }

            else if (preSpeed == fan.OFF) {

                fan.off();

            }

        }

    }

     

    class FanOffCommand implements Command {

        Fan fan;

        int preSpeed;

        FanOffCommand(Fan fan) {

            this.fan = fan;

        }

        public void execute() {

            preSpeed = fan.getSpeed();

            fan.off();

        }

        public void undo() {

            if (preSpeed == fan.HIGH) {

                fan.high();

            }

            else if (preSpeed == fan.MEDIUM) {

                fan.medium();

            }

            else if (preSpeed == fan.LOW) {

                fan.low();

            }

            else if (preSpeed == fan.OFF) {

                fan.off();

            }

        }

    }

     

    class LightOnCommand implements Command {

        Light light;

        LightOnCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.on();

        }

        public void undo() {

            light.off();

        }

    }

     

    class LightOffCommand implements Command {

        Light light;

        LightOffCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.off();

        }

        public void undo() {

            light.on();

        }

    }

     

    class GarageDoorOpenCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorOpenCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.open();

        }

        public void undo() {

            garageDoor.close();

        }

    }

     

    class GarageDoorCloseCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorCloseCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.close();

        }

        public void undo() {

            garageDoor.open();

        }

    }

     

    class RemoteControl {

        Command[] onCommands;

        Command[] offCommands;

        Command noCommand = new noCommand();

        Command lastCommand;

        public RemoteControl() {

            onCommands = new Command[7];

            offCommands = new Command[7];

            for (int i = 0; i < 7; i++) {

                onCommands[i] = noCommand;

                offCommands[i] = noCommand;

            }

        }

        public void setControl(int slot, Command onCommand, Command offCommand) {

            onCommands[slot] = onCommand;

            offCommands[slot] = offCommand;

        }

        public void onButtonDown(int slot) {

            onCommands[slot].execute();

            lastCommand = onCommands[slot];

        }

        public void offButtonDown(int slot) {

            offCommands[slot].execute();

            lastCommand = offCommands[slot];

        }

        public void undoButtonDown() {

            lastCommand.undo();

        }

    }

     

    我們看到FanHighCommandFanOffCommand中有重復(fù)的undo,很容易想到,把它們給“抽象工廠”了:

    package javaapplication30;

     

    public class Main {

        public static void main(String[] args) {

            Light light = new Light();

            GarageDoor garageDoor = new GarageDoor();

            RemoteControl rc = new RemoteControl();

     

            Command onCommand = new LightOnCommand(light);

            Command offCommand = new LightOffCommand(light);

            rc.setControl(0, onCommand, offCommand);

     

            onCommand = new GarageDoorOpenCommand(garageDoor);

            offCommand = new GarageDoorCloseCommand(garageDoor);

            rc.setControl(1, onCommand, offCommand);

     

            rc.onButtonDown(0);

            rc.undoButtonDown();

            rc.offButtonDown(1);

            rc.offButtonDown(0);

            rc.onButtonDown(1);

            rc.undoButtonDown();

     

            Fan fan = new Fan();

            onCommand = new FanHighCommand(fan);

            offCommand = new FanOffCommand(fan);

            rc.setControl(2, onCommand, offCommand);

            rc.onButtonDown(2);

            rc.offButtonDown(2);

            rc.undoButtonDown();

        }

    }

     

    class Light {

        public void on() {

            System.out.println("turn Light on.");

        }

        void off() {

            System.out.println("turn light off");

        }

    }

     

    class GarageDoor {

        public void open() {

            System.out.println("open GarageDoor");

        }

        public void close() {

            System.out.println("close GarageDoor");

        }

    }

     

    class Fan {

        public final int HIGH = 3;

        public final int MEDIUM = 2;

        public final int LOW = 1;

        public final int OFF = 0;

        public int speed = 0;

        public void high() {

            speed = HIGH;

            System.out.println("Fan's speed is " + speed);

        }

        public void low() {

            speed = LOW;

            System.out.println("Fan's speed is " + speed);

        }

        public void medium() {

            speed = MEDIUM;

            System.out.println("Fan's speed is " + speed);

        }

        public void off() {

            speed = OFF;

            System.out.println("Fan's speed is " + speed);

        }

        public int getSpeed() {

            return speed;

        }

    }

     

    interface Command {

        public void execute();

        public void undo();

    }

     

    class noCommand implements Command {

        public void execute() {

            System.out.println("no command here.");

        }

        public void undo() {

            System.out.println("no command here.");

        }

    }

     

    abstract class FanCommand {

        Fan fan;

        int preSpeed;

        abstract void execute();

        public void undo() {

            if (preSpeed == fan.HIGH) {

                fan.high();

            }

            else if (preSpeed == fan.MEDIUM) {

                fan.medium();

            }

            else if (preSpeed == fan.LOW) {

                fan.low();

            }

            else if (preSpeed == fan.OFF) {

                fan.off();

            }

        }

    }

     

    class FanHighCommand extends FanCommand implements Command {

        FanHighCommand(Fan fan) {

            super.fan = fan;

        }

        public void execute() {

            preSpeed = fan.getSpeed();

            fan.high();

        }

    }

     

    class FanOffCommand extends FanCommand implements Command {

        FanOffCommand(Fan fan) {

            super.fan = fan;

        }

        public void execute() {

            preSpeed = fan.getSpeed();

            fan.off();

        }

    }

     

    class LightOnCommand implements Command {

        Light light;

        LightOnCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.on();

        }

        public void undo() {

            light.off();

        }

    }

     

    class LightOffCommand implements Command {

        Light light;

        LightOffCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.off();

        }

        public void undo() {

            light.on();

        }

    }

     

    class GarageDoorOpenCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorOpenCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.open();

        }

        public void undo() {

            garageDoor.close();

        }

    }

     

    class GarageDoorCloseCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorCloseCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.close();

        }

        public void undo() {

            garageDoor.open();

        }

    }

     

    class RemoteControl {

        Command[] onCommands;

        Command[] offCommands;

        Command noCommand = new noCommand();

        Command lastCommand;

        public RemoteControl() {

            onCommands = new Command[7];

            offCommands = new Command[7];

            for (int i = 0; i < 7; i++) {

                onCommands[i] = noCommand;

                offCommands[i] = noCommand;

            }

        }

        public void setControl(int slot, Command onCommand, Command offCommand) {

            onCommands[slot] = onCommand;

            offCommands[slot] = offCommand;

        }

        public void onButtonDown(int slot) {

            onCommands[slot].execute();

            lastCommand = onCommands[slot];

        }

        public void offButtonDown(int slot) {

            offCommands[slot].execute();

            lastCommand = offCommands[slot];

        }

        public void undoButtonDown() {

            lastCommand.undo();

        }

    }

     

     

    下面我們想讓一個(gè)按鈕實(shí)現(xiàn)一串命令:關(guān)燈,關(guān)電扇,開(kāi)車(chē)庫(kù)。很顯然,用一個(gè)新的XXXCommand實(shí)現(xiàn)即可。

    package javaapplication30;

     

    public class Main {

        public static void main(String[] args) {

            Light light = new Light();

            GarageDoor garageDoor = new GarageDoor();

            RemoteControl rc = new RemoteControl();

     

            Command onCommand = new LightOnCommand(light);

            Command offCommand = new LightOffCommand(light);

            rc.setControl(0, onCommand, offCommand);

     

            onCommand = new GarageDoorOpenCommand(garageDoor);

            offCommand = new GarageDoorCloseCommand(garageDoor);

            rc.setControl(1, onCommand, offCommand);

     

            rc.onButtonDown(0);

            rc.undoButtonDown();

            rc.offButtonDown(1);

            rc.offButtonDown(0);

            rc.onButtonDown(1);

            rc.undoButtonDown();

     

            Fan fan = new Fan();

            onCommand = new FanHighCommand(fan);

            offCommand = new FanOffCommand(fan);

            rc.setControl(2, onCommand, offCommand);

            rc.onButtonDown(2);

            rc.offButtonDown(2);

            rc.undoButtonDown();

     

            onCommand = new ConsecutiveCommands(light, garageDoor, fan);

            rc.setControl(3, onCommand, null);

            rc.onButtonDown(3);

            rc.undoButtonDown();

        }

    }

     

    class Light {

        public void on() {

            System.out.println("turn Light on.");

        }

        void off() {

            System.out.println("turn light off");

        }

    }

     

    class GarageDoor {

        public void open() {

            System.out.println("open GarageDoor");

        }

        public void close() {

            System.out.println("close GarageDoor");

        }

    }

     

    class Fan {

        public final int HIGH = 3;

        public final int MEDIUM = 2;

        public final int LOW = 1;

        public final int OFF = 0;

        public int speed = 0;

        public void high() {

            speed = HIGH;

            System.out.println("Fan's speed is " + speed);

        }

        public void low() {

            speed = LOW;

            System.out.println("Fan's speed is " + speed);

        }

        public void medium() {

            speed = MEDIUM;

            System.out.println("Fan's speed is " + speed);

        }

        public void off() {

            speed = OFF;

            System.out.println("Fan's speed is " + speed);

        }

        public int getSpeed() {

            return speed;

        }

    }

     

    interface Command {

        public void execute();

        public void undo();

    }

     

    class noCommand implements Command {

        public void execute() {

            System.out.println("no command here.");

        }

        public void undo() {

            System.out.println("no command here.");

        }

    }

     

    abstract class FanCommand {

        Fan fan;

        int preSpeed;

        abstract void execute();

        public void undo() {

            if (preSpeed == fan.HIGH) {

                fan.high();

            }

            else if (preSpeed == fan.MEDIUM) {

                fan.medium();

            }

            else if (preSpeed == fan.LOW) {

                fan.low();

            }

            else if (preSpeed == fan.OFF) {

                fan.off();

            }

        }

    }

     

    class FanHighCommand extends FanCommand implements Command {

        FanHighCommand(Fan fan) {

            super.fan = fan;

        }

        public void execute() {

            preSpeed = fan.getSpeed();

            fan.high();

        }

    }

     

    class FanOffCommand extends FanCommand implements Command {

        FanOffCommand(Fan fan) {

            super.fan = fan;

        }

        public void execute() {

            preSpeed = fan.getSpeed();

            fan.off();

        }

    }

     

    class ConsecutiveCommands implements Command {

        Light light;

        Fan fan;

        GarageDoor garageDoor;

        int preSpeed;

        ConsecutiveCommands(Light light, GarageDoor garageDoor, Fan fan) {

            this.light = light;

            this.garageDoor = garageDoor;

            this.fan = fan;

        }

        public void execute() {

            light.off(); //關(guān)燈

            preSpeed = fan.getSpeed(); //記錄原先的電扇檔位

            fan.off(); //關(guān)電扇

            garageDoor.open() ; //開(kāi)車(chē)庫(kù)

        }

        public void undo() {

            light.on();

           

    if (preSpeed == fan.HIGH) {

                fan.high();

            }

            else if (preSpeed == fan.MEDIUM) {

                fan.medium();

            }

            else if (preSpeed == fan.LOW) {

                fan.low();

            }

            else if (preSpeed == fan.OFF) {

                fan.off();

            }

          

     garageDoor.close();

        }

    }

     

    class LightOnCommand implements Command {

        Light light;

        LightOnCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.on();

        }

        public void undo() {

            light.off();

        }

    }

     

    class LightOffCommand implements Command {

        Light light;

        LightOffCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.off();

        }

        public void undo() {

            light.on();

        }

    }

     

    class GarageDoorOpenCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorOpenCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.open();

        }

        public void undo() {

            garageDoor.close();

        }

    }

     

    class GarageDoorCloseCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorCloseCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.close();

        }

        public void undo() {

            garageDoor.open();

        }

    }

     

    class RemoteControl {

        Command[] onCommands;

        Command[] offCommands;

        Command noCommand = new noCommand();

        Command lastCommand;

        public RemoteControl() {

            onCommands = new Command[7];

            offCommands = new Command[7];

            for (int i = 0; i < 7; i++) {

                onCommands[i] = noCommand;

                offCommands[i] = noCommand;

            }

        }

        public void setControl(int slot, Command onCommand, Command offCommand) {

            onCommands[slot] = onCommand;

            offCommands[slot] = offCommand;

        }

        public void onButtonDown(int slot) {

            onCommands[slot].execute();

            lastCommand = onCommands[slot];

        }

        public void offButtonDown(int slot) {

            offCommands[slot].execute();

            lastCommand = offCommands[slot];

        }

        public void undoButtonDown() {

            lastCommand.undo();

        }

    }

     

     

    這里有個(gè)問(wèn)題,就是ConsecutiveCommand給寫(xiě)死了,如果我還需要一個(gè)新的連續(xù)的命令組合,我就要編寫(xiě)ConsecutiveCommand2ConsecutiveCommand3等等。能不能只寫(xiě)一個(gè),而實(shí)現(xiàn)動(dòng)態(tài)配置呢?靠傳個(gè)參數(shù)告訴它要執(zhí)行哪一串命令可以嗎?

    package javaapplication30;

     

    public class Main {

        public static void main(String[] args) {

            Light light = new Light();

            GarageDoor garageDoor = new GarageDoor();

            Fan fan = new Fan();

            RemoteControl rc = new RemoteControl();

     

            Command fanHighCommand = new FanHighCommand(fan);

            Command fanOffCommand = new FanOffCommand(fan);

            Command garageDoorCloseCommand = new GarageDoorCloseCommand(garageDoor);

            Command garageDoorOpenCommand = new GarageDoorOpenCommand(garageDoor);

            Command lightOffCommand = new LightOffCommand(light);

            Command lightOnCommand = new LightOnCommand(light);

     

            Command[] commands = {lightOffCommand, fanOffCommand, garageDoorOpenCommand};

            Command consecutiveCommands = new ConsecutiveCommands(commands);

           

            rc.setControl(0, fanHighCommand, fanOffCommand);

            rc.setControl(1, garageDoorOpenCommand, garageDoorCloseCommand);

            rc.setControl(2, lightOnCommand, lightOffCommand);       

            rc.setControl(3, consecutiveCommands, null);

           

            for(int i=0;i<=3;i++)

                rc.onButtonDown(i);

        }

    }

     

    class Light {

        public void on() {

            System.out.println("turn Light on.");

        }

        void off() {

            System.out.println("turn light off");

        }

    }

     

    class GarageDoor {

        public void open() {

            System.out.println("open GarageDoor");

        }

        public void close() {

            System.out.println("close GarageDoor");

        }

    }

     

    class Fan {

        public final int HIGH = 3;

        public final int MEDIUM = 2;

        public final int LOW = 1;

        public final int OFF = 0;

        public int speed = 0;

        public void high() {

            speed = HIGH;

            System.out.println("Fan's speed is " + speed);

        }

        public void low() {

            speed = LOW;

            System.out.println("Fan's speed is " + speed);

        }

        public void medium() {

            speed = MEDIUM;

            System.out.println("Fan's speed is " + speed);

        }

        public void off() {

            speed = OFF;

            System.out.println("Fan's speed is " + speed);

        }

        public int getSpeed() {

            return speed;

        }

    }

     

    interface Command {

        public void execute();

        public void undo();

    }

     

    class noCommand implements Command {

        public void execute() {

            System.out.println("no command here.");

        }

        public void undo() {

            System.out.println("no command here.");

        }

    }

     

    abstract class FanCommand {

        Fan fan;

        int preSpeed;

        abstract void execute();

        public void undo() {

            if (preSpeed == fan.HIGH) {

                fan.high();

            }

            else if (preSpeed == fan.MEDIUM) {

                fan.medium();

            }

            else if (preSpeed == fan.LOW) {

                fan.low();

            }

            else if (preSpeed == fan.OFF) {

                fan.off();

            }

        }

    }

     

    class FanHighCommand extends FanCommand implements Command {

        FanHighCommand(Fan fan) {

            super.fan = fan;

        }

        public void execute() {

            preSpeed = fan.getSpeed();

            fan.high();

        }

    }

     

    class FanOffCommand extends FanCommand implements Command {

        FanOffCommand(Fan fan) {

            super.fan = fan;

        }

        public void execute() {

            preSpeed = fan.getSpeed();

            fan.off();

        }

    }

     

    class ConsecutiveCommands implements Command {

        Command[] commands;

        ConsecutiveCommands(Command[] commands) {

            this.commands = commands;

        }

        public void execute() {

            for (int i = 0; i < commands.length; i++) {

                commands[i].execute();

            }

        }

        public void undo() {

            for (int i = 0; i < commands.length; i++) {

                commands[i].undo();

            }

        }

    }

     

    class LightOnCommand implements Command {

        Light light;

        LightOnCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.on();

        }

        public void undo() {

            light.off();

        }

    }

     

    class LightOffCommand implements Command {

        Light light;

        LightOffCommand(Light light) {

            this.light = light;

        }

        public void execute() {

            light.off();

        }

        public void undo() {

            light.on();

        }

    }

     

    class GarageDoorOpenCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorOpenCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.open();

        }

        public void undo() {

            garageDoor.close();

        }

    }

     

    class GarageDoorCloseCommand implements Command {

        GarageDoor garageDoor;

        GarageDoorCloseCommand(GarageDoor garageDoor) {

            this.garageDoor = garageDoor;

        }

        public void execute() {

            garageDoor.close();

        }

        public void undo() {

            garageDoor.open();

        }

    }

     

    class RemoteControl {

        Command[] onCommands;

        Command[] offCommands;

        Command noCommand = new noCommand();

        Command lastCommand;

        public RemoteControl() {

            onCommands = new Command[7];

            offCommands = new Command[7];

            for (int i = 0; i < 7; i++) {

                onCommands[i] = noCommand;

                offCommands[i] = noCommand;

            }

        }

        public void setControl(int slot, Command onCommand, Command offCommand) {

            onCommands[slot] = onCommand;

            offCommands[slot] = offCommand;

        }

        public void onButtonDown(int slot) {

            onCommands[slot].execute();

            lastCommand = onCommands[slot];

        }

        public void offButtonDown(int slot) {

            offCommands[slot].execute();

            lastCommand = offCommands[slot];

        }

        public void undoButtonDown() {

            lastCommand.undo();

        }

    }

     

     

    posted on 2008-07-02 11:26 化的了 閱讀(2383) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): 設(shè)計(jì)模式

    Feedback

    # re: 命令模式 Command Pattern 2008-07-02 12:53 無(wú)羽蒼鷹
    感覺(jué)非常棒,收藏!  回復(fù)  更多評(píng)論
      

    # re: 命令模式 Command Pattern 2008-07-02 14:01 網(wǎng)賺
    b 不錯(cuò)哈  回復(fù)  更多評(píng)論
      

    # re: 命令模式 Command Pattern 2008-09-26 10:59 skk
    Thank you!  回復(fù)  更多評(píng)論
      

    # re: 命令模式 Command Pattern[未登錄](méi) 2010-04-16 18:14 cc
    nice article, but your English is not good enough.  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 国产成人A亚洲精V品无码| 四虎免费久久影院| 亚洲国产精品久久久久久| 97无码人妻福利免费公开在线视频| 亚洲成AⅤ人影院在线观看| 久久亚洲精品无码av| 国产精品国产免费无码专区不卡| 亚洲乱色熟女一区二区三区蜜臀| 免费被黄网站在观看| 亚洲AV成人一区二区三区观看| 又粗又大又硬又爽的免费视频| 深夜特黄a级毛片免费播放| 亚洲乱码日产精品a级毛片久久| 韩国免费a级作爱片无码| 久久亚洲AV午夜福利精品一区| 99爱免费观看视频在线| 亚洲中文字幕在线无码一区二区 | 亚洲欧美成aⅴ人在线观看| 韩国二级毛片免费播放| 精品特级一级毛片免费观看| 中文字幕亚洲日本岛国片| a成人毛片免费观看| 久久久久久久亚洲Av无码| 一二三四视频在线观看中文版免费 | 国产亚洲精品精品国产亚洲综合| 拍拍拍无挡视频免费观看1000| 久久精品国产亚洲AV嫖农村妇女| 日韩精品成人无码专区免费| 国产精品亚洲专区在线播放| 精品国产亚洲一区二区三区| 91热成人精品国产免费| 国产成人亚洲综合无| 亚洲va久久久噜噜噜久久狠狠| 人妻视频一区二区三区免费| 成年网站免费入口在线观看| 99ri精品国产亚洲| 在线观看视频免费国语| a国产成人免费视频| 97se亚洲国产综合自在线| 久久久久国产成人精品亚洲午夜| 久久www免费人成看片|