1. 程式人生 > 實用技巧 >1725最少硬幣問題(DP)

1725最少硬幣問題(DP)

State Patterns

GoF定義:使一個物件在其自身狀態發生變化時其行為也對應發生變化。這個物件看起來像是改變了它的類

概念

用事實說話【滑稽】

例子

現實世界:想象在網路連線中,這裡負責連線的物件會有很多種狀態(正在連線、連線成功、連線關閉)
程式碼世界:假設一個系統只能處理固定數量個任務,那麼當一個新任務來,它可能會處理這個任務,也可能會提示任務已滿,當前不能處理這個任務

展示

本例中模擬了開關電視的操作

程式碼

public class StatePattern {
    public static void main(String[] args) {
        System.out.println("***State Pattern Demo***\n");
        //Initially TV is Off
        Off initialState = new Off();
        TV tv = new TV(initialState);
        //First time press
        tv.pressButton();
        //Second time press
        tv.pressButton();
    }
}

class TV {
    private RemoteControl state;

    public TV(RemoteControl state) {
        this.state = state;
    }

    public RemoteControl getState() {
        return state;
    }

    public void setState(RemoteControl state) {
        this.state = state;
    }

    public void pressButton() {
        this.state.pressSwitch(this);
    }
}

abstract class RemoteControl {
    abstract void pressSwitch(TV context);
}

class On extends RemoteControl {
    @Override
    void pressSwitch(TV context) {
        System.out.println("I am already On .Going to be Off now");
        context.setState(new Off());
    }
}

class Off extends RemoteControl {
    @Override
    void pressSwitch(TV context) {
        System.out.println("I am Off .Going to be On now");
        context.setState(new On());
    }
}

Note

  1. 作為人類,當我們心情不錯的時候,可能在各方面表現會更好,而當我們心情糟糕時,表現會更差。這樣的道理可以應用到這個模式中,即當我們需要物件的狀態改變而其行文發生變化,那麼這個模式很易用
  2. 注意:如果狀態的數量增加了這個系統的複雜度,那麼會使得程式碼難以維護

思考

狀態模式針對的物件,它應對不同狀況採取的行為是要定義在其它類中(例子中的RemoteControl),物件本身會持有一個這樣的類的物件,當它的狀態被改變,它把自己傳入到控制物件的方法中,此時執行的行為都是基於它改變過後的狀態