java 命令模式詳解,敢不敢稍微不同一點

你是不是把網上那些命令模式看膩了,千篇一律的抄襲,那個類圖不知道是那裏畫的,明明都錯了,那麼多人貼上來,代碼也直接copy過來。。。我已經無力吐槽了。


我根據自己想法寫TV的命令模式例子


乾貨,上代碼


//電視表示接收者類
class TV{
    private int currentChannel=0,lastChannel=0;
    public void turnon(){
        System.out.println("TV ON " + currentChannel);
    }
    public void turnoff(){
        System.out.println("TV OFF");
        lastChannel=currentChannel;
        currentChannel=0;
    }
    public void turnChanle(int to){
        System.out.println("change channel from  "+currentChannel+" to "+ to);
        lastChannel=currentChannel ;
        currentChannel = to;
    }
    public void undo(){
        turnChanle(lastChannel);
    }
}
//抽象的命令類,不同於其他地方說的Command接口 , 感覺可以寫一個Commad接口只包含execute方法,然後用TVCommand實現它,有興趣的可以試試
abstract class TVCommand{
    protected TV tv;
    public abstract void execute();
}
//一下都是具體的命令類
class TurnOnConcreteTVcommand extends TVCommand{

    @Override
    public void execute() {
        tv.turnon();
    }
    public TurnOnConcreteTVcommand(TV tv){
        this.tv = tv;
    }
}
class TurnOffConcreteTVcommand extends TVCommand{

    @Override
    public void execute() {
        tv.turnoff();
    }
    public TurnOffConcreteTVcommand(TV tv){
        this.tv = tv;
    }
}
class TurnChannelConcreteTVcommand extends TVCommand{

    protected int tochannel;
    @Override
    public void execute() {
        tv.turnChanle(tochannel);
    }
    public void setTochannel(int tochannel) {
        this.tochannel = tochannel;
    }
    public TurnChannelConcreteTVcommand(TV tv){
        this.tv = tv;
    }
}
class UndoConcreteTVcommand extends TVCommand{

    @Override
    public void execute() {
        tv.undo();
    }
    public UndoConcreteTVcommand(TV tv){
        this.tv = tv;
    }
}
// 遙控器  調用者,和用戶交互的接口
class ControlPanel{
    private ArrayList<TVCommand>  commandArryList = new ArrayList<>();

    public void turnon(){
        boolean flag= false;
        for (TVCommand command :commandArryList){
            if (command instanceof TurnOnConcreteTVcommand){
                command.execute();
                flag=true;
                break;
            }
        }
        if (!flag){
            alert();
        }
    }
    public void turnoff(){
        boolean flag= false;
        for (TVCommand command :commandArryList){
            if (command instanceof TurnOffConcreteTVcommand){
                command.execute();
                flag=true;
                break;
            }
        }
        if (!flag){
            alert();
        }
    }
    public void turnChannel(int to){
        boolean flag= false;
        for (TVCommand command :commandArryList){
            if (command instanceof TurnChannelConcreteTVcommand){
                TurnChannelConcreteTVcommand turnChannelConcreteTVcommand = (TurnChannelConcreteTVcommand) command;
                turnChannelConcreteTVcommand.setTochannel(to);
                turnChannelConcreteTVcommand.execute();
                flag=true;
                break;
            }
        }
        if (!flag){
            alert();
        }

    }
    public void undo(){
        boolean flag =false;
        for (TVCommand command :commandArryList){
            if (command instanceof UndoConcreteTVcommand){
                command.execute();
                flag=true;
                break;
            }
        }
        if (!flag){
            alert();
        }
    }
    public void addCommand(TVCommand command){
        commandArryList.add(command);
    }
    private void alert(){
        System.out.println("此遙控板不支持此功能");

    }
}

class Client1{
    public static void main(String[] args) {
        //電視
        TV tv = new TV();
        //具體的命令
        TVCommand onCommand = new TurnOnConcreteTVcommand(tv);
        TVCommand offCommand = new TurnOffConcreteTVcommand(tv);
        TVCommand turnChannelCommand = new TurnChannelConcreteTVcommand(tv);
        TVCommand undoCommand = new UndoConcreteTVcommand(tv);
        //將命令加入到遙控器上,相當於所有的命令組合在一起形成了一個遙控器
        ControlPanel controlPanel = new ControlPanel();
        controlPanel.addCommand(onCommand);
        controlPanel.addCommand(offCommand);
        controlPanel.addCommand(turnChannelCommand);
        //controlPanel.addCommand(undoCommand);
        //直接點擊遙控器上的按鈕
        controlPanel.turnon();
        //具體的點擊的時候才選擇切換到 XX 頻道
        controlPanel.turnChannel(20);
        controlPanel.turnChannel(30);
        controlPanel.turnChannel(40);
        controlPanel.undo();
        controlPanel.turnoff();
        controlPanel.turnon();


    }

在Invoker類上,我寫了很多操作,我不知道這樣是對是錯,歡迎指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章