2010年5月7日 星期五

Design Pattern : 19 State

如果在開發程式裡,會需要對不同的狀態,有不同的處理方式
可以把各種狀態的處理,各自包裝形成一個獨立的State Class
也就是說,透過State切割,把複雜的處理,切割成各自獨立小的區塊,
每個State很單純的處理該狀態下的執行功能,
以這方式執行,亦可很輕易的擴充程式功能

參與者
1.State 介面
定義出所有State所允許被呼叫的共同function
public interface State {
   public void showMessage(String user);
}

2.DayState 依照State實作出的Class
public class DayState implements State {
    private static DayState instance=new DayState();
    public static DayState getInstance(){
        return instance;
    }
    @Override
    public void showMessage(String user) {        
        System.out.println(user+" : Its Day");
    }
}

3.NightState 依照State實作出的Class
public class NightState implements State {
    private static NightState instance=new NightState();
    public static NightState getInstance(){
        return instance;
    }
    @Override
    public void showMessage(String user) {        
        System.out.println(user+" : its Night");
    }
}

4.MyFrame 使用State的主要程式
包含了setState function作為狀態轉移使用
在這裡要執行的動作,都只需要呼叫state的method即可,不需要
考慮真正的State實體是哪一個,
State的轉換都會透過外部呼叫setState來改變
public class MyFrame {
    private State state;
    public MyFrame(){}
    public void setState(String info){
        if(info=="day"){
            state=DayState.getInstance();
        }else{
            state=NightState.getInstance();
        }
    }
    public void showMessage(String user){
        state.showMessage(user);
    }
}

5.Main 外部程式
MyFrame frame=new MyFrame();
for(int hour=1;hour<=24;hour++){
    if((hour>=8)&&(hour<=18)){
        frame.setState("day");
    }else{
        frame.setState("night");
    }
    frame.showMessage("ozzy");
    try{
        Thread.sleep(1000);
    }catch(InterruptedException e){}
    
}