国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

開發之路(設計模式六:命令模式下)

CarlBenjamin / 2478人閱讀

摘要:要點命令模式將發出請求的對象和執行請求的對象解耦。感謝你看到這里,命令模式到這里就結束了,本人文筆隨便,若有不足或錯誤之處望給予指點,度彎腰很快我會發布下一個設計模式的內容,生命不息,編程不止

繼續上部分的說

在之前的文章最后寫了一個帶有撤銷電燈功能的遙控器功能,通常,想要實現撤銷的功能,需要記錄撤銷之前的狀態是什么,就比方說電扇,允許有多個風速狀態,也允許被關閉。
直接上代碼。

1、風扇類

package CeilingFan;
/**
 * 使用狀態實現撤銷
 * 風扇類
 * @author Joy
 * 
 */
public class CeilingFan {
    public static final int HIGH = 3;
    public static final int MEDIUM = 2;
    public static final int LOW = 1;
    public static final int OFF = 0;
    String location;
    int speed;

    public CeilingFan(String location) {
        this.location = location;
    }

    // 高轉速
    public void high() {
        speed = HIGH;
        System.out.println(location+"風扇正在高轉速運行");
    }

    // 中轉速
    public void medium() {
        speed = MEDIUM;
        System.out.println(location+"風扇正在中轉速運行");
    }

    // 低轉速
    public void low() {
        speed = LOW;
        System.out.println(location+"風扇正在低轉速運行");
    }

    // 關閉吊扇
    public void off() {
        speed = OFF;
        System.out.println(location+"風扇關閉");
    }
    
    //獲取當前吊扇速度
    public int getSpeed(){
        return speed;
    }
}

2、命令類

package CeilingFan;

public interface Command {
    public void execute();

    public void undo();
}

3、下面是風扇高、中、低關閉的具體實現類

package CeilingFan;

/**
 * 風扇高速操作
 * 
 * @author Joy
 * 
 */
public class CeilingFanHighCommand implements Command {
    CeilingFan ceilingFan;
    int prevSpeed;

    public CeilingFanHighCommand(CeilingFan ceilingFan) {
        this.ceilingFan = ceilingFan;
    }

    // 執行
    @Override
    public void execute() {
        // 執行方法前,先獲取之前的狀態并記錄下來
        prevSpeed = ceilingFan.getSpeed();
        ceilingFan.high();
    }

    // 撤銷
    @Override
    public void undo() {
        // 將風扇的速度設置為之前的狀態,達到撤銷目的
        switch (prevSpeed) {
        case CeilingFan.HIGH:
            ceilingFan.high();
            break;
        case CeilingFan.MEDIUM:
            ceilingFan.medium();
            break;
        case CeilingFan.LOW:
            ceilingFan.low();
            break;
        case CeilingFan.OFF:
            ceilingFan.off();
            break;
        }
    }
}
package CeilingFan;
/**
 * 風扇中速操作
 * @author Joy
 *
 */
public class CeilingFanMediumCommand implements Command {
    CeilingFan ceilingFan;
    int prevSpeed;

    public CeilingFanMediumCommand(CeilingFan ceilingFan) {
        this.ceilingFan = ceilingFan;
    }

    public void execute() {
        prevSpeed = ceilingFan.getSpeed();
        ceilingFan.medium();
    }

    public void undo() {
        switch (prevSpeed) {
        case CeilingFan.HIGH:
            ceilingFan.high();
            break;
        case CeilingFan.MEDIUM:
            ceilingFan.medium();
            break;
        case CeilingFan.LOW:
            ceilingFan.low();
            break;
        default:
            ceilingFan.off();
            break;
        }
    }
}
package CeilingFan;
/**
 * 風扇低速操作
 * @author Joy
 *
 */
public class CeilingFanLowCommand implements Command {
    CeilingFan ceilingFan;
    int prevSpeed;

    public CeilingFanLowCommand(CeilingFan ceilingFan) {
        this.ceilingFan = ceilingFan;
    }

    @Override
    public void execute() {
        prevSpeed = ceilingFan.getSpeed();
        ceilingFan.low();

    }

    @Override
    public void undo() {
        switch (prevSpeed) {
        case CeilingFan.HIGH:
            ceilingFan.high();
            break;
        case CeilingFan.MEDIUM:
            ceilingFan.medium();
            break;
        case CeilingFan.LOW:
            ceilingFan.low();
            break;
        default:
            ceilingFan.off();
            break;
        }
    }
}
package CeilingFan;
/**
 * 風扇關閉
 * @author Joy
 *
 */
public class CeilingFanOffCommand implements Command {
    CeilingFan ceilingFan;
    int prevSpeed;

    public CeilingFanOffCommand(CeilingFan ceilingFan) {
        this.ceilingFan = ceilingFan;
    }

    public void execute() {
        prevSpeed = ceilingFan.getSpeed();
        ceilingFan.off();
    }

    public void undo() {
        switch (prevSpeed) {
        case CeilingFan.HIGH:
            ceilingFan.high();
            break;
        case CeilingFan.MEDIUM:
            ceilingFan.medium();
            break;
        case CeilingFan.LOW:
            ceilingFan.low();
            break;
        default:
            ceilingFan.off();
            break;
        }
    }
}

4、無操作類接口

package CeilingFan;

public class NoCommand implements Command {
    public void execute() { }
    public void undo() { }
}

5、調用者

package CeilingFan;
/**
 * 調用者
 * @author Joy
 *
 */
public class RemoteControlWithUndo {
    Command[] onCommands;
    Command[] offCommands;
    Command undoCommand;
 
    public RemoteControlWithUndo() {
        onCommands = new Command[7];
        offCommands = new Command[7];
 
        Command noCommand = new NoCommand();
        for(int i=0;i<7;i++) {
            onCommands[i] = noCommand;
            offCommands[i] = noCommand;
        }
        undoCommand = noCommand;
    }
  
    public void setCommand(int slot, Command onCommand, Command offCommand) {
        onCommands[slot] = onCommand;
        offCommands[slot] = offCommand;
    }
 
    public void onButtonWasPushed(int slot) {
        onCommands[slot].execute();
        undoCommand = onCommands[slot];
    }
 
    public void offButtonWasPushed(int slot) {
        offCommands[slot].execute();
        undoCommand = offCommands[slot];
    }
 
    public void undoButtonWasPushed() {
        undoCommand.undo();
    }
  
    public String toString() {
        StringBuffer stringBuff = new StringBuffer();
        stringBuff.append("
------ 遙控器 -------
");
        for (int i = 0; i < onCommands.length; i++) {
            stringBuff.append("[插槽 " + i + "] " + onCommands[i].getClass().getName()
                + "    " + offCommands[i].getClass().getName() + "
");
        }
        stringBuff.append("[撤銷] " + undoCommand.getClass().getName() + "
");
        return stringBuff.toString();
    }
}

6、測試類

package CeilingFan;

public class TestMain {
    public static void main(String[] args) {
        //實例化遙控器
        RemoteControlWithUndo remoteControl=new RemoteControlWithUndo();
        CeilingFan ceilingFan=new CeilingFan("臥室");
        //這里高中低速 關閉分別實例化
        CeilingFanHighCommand highCommand=new CeilingFanHighCommand(ceilingFan);
        CeilingFanMediumCommand mediumCommand=new CeilingFanMediumCommand(ceilingFan);
        CeilingFanLowCommand  lowCommand=new CeilingFanLowCommand(ceilingFan);
        CeilingFanOffCommand offCommand=new CeilingFanOffCommand(ceilingFan);
        
        //遙控器加載中速和高速的開啟和關閉方法
        remoteControl.setCommand(0, mediumCommand, offCommand);
        remoteControl.setCommand(1, highCommand, offCommand);
        //先以中速開啟吊扇
        remoteControl.onButtonWasPushed(0);
        //關閉吊扇
        remoteControl.offButtonWasPushed(0);
        //顯示插槽調用信息
        System.out.println(remoteControl.toString());
        //撤銷,會變為中速
        remoteControl.undoButtonWasPushed();
        
        remoteControl.onButtonWasPushed(1);
        System.out.println(remoteControl.toString());
        remoteControl.undoButtonWasPushed();    
    }
}

7、效果圖

其實命令模式還能用于宏命令,隊列請求,日志請求,命令模式我理解的很一般,往后我還會補充修改此篇內容。

要點:
1:命令模式將發出請求的對象和執行請求的對象解耦。
2:被解耦的兩者之間是通過命令對象進行溝通的。命令對象封裝了接收者和一個或一組對象
3:調用者通過調用命令對象的execute方法發出請求,這會使得的接收者的動作被調用。
4:命令可以支持撤銷動作,實現一個undo方法來回到execute被執行前的狀態。

感謝你看到這里,命令模式到這里就結束了,本人文筆隨便,若有不足或錯誤之處望給予指點,90度彎腰~~~很快我會發布下一個設計模式的內容,生命不息,編程不止!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70335.html

相關文章

  • 開發之路設計模式命令模式上)

    摘要:好的,我重新繪制了一張圖反映命令模式如下圖,流程與上圖相同。感謝你看到這里,命令模式的上部分到這里就結束了,本人文筆隨便,若有不足或錯誤之處望給予指點,度彎腰很快我會發布命令模式下的內容,生命不息,編程不止參考書籍設計模式 封裝調用:將方法調用給封裝起來。 這次講的是命令模式,他的作用就是方法給封裝起來,有需要的時候就調用,調用者并不需要關心它是如何實現的。 我們來看一張流程...

    terasum 評論0 收藏0
  • Docker學習之路)用commit命令創建鏡像

    摘要:郵件激活后,可以測試登錄這條命令會完成登錄,并將認證信息報錯起來供后面使用。所以先用命令退出容器,再運行命令命令中,指定了要提交的修改過的容器的目標鏡像倉庫鏡像名。提交的知識創建容器的鏡像與容器的當前狀態之間的差異部分,很輕量。 假期快要結束了,干點正事,接著Docker的學習。 構建鏡像 構建鏡像的兩種方法: 使用docker commit 命令 使用docker build...

    KoreyLee 評論0 收藏0
  • Javag工程師成神之路(2019正式版)

    摘要:結構型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態模式策略模式職責鏈模式責任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發布 v1.1 2018-03-12 增加新技術知識、完善知識體系 v2.0 2019-02-19 結構...

    Olivia 評論0 收藏0

發表評論

0條評論

CarlBenjamin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<