還用if--else?

今天是11月4日是2006下半年全國計算機技術與軟件專業技術資格(水平)考試簡稱軟考
我是考軟件設計師的,考的情況就不說了---這個跟下文無關
在下午題的最後一題給我很大的啓發,看下文應該能知道答案了---
我覺的出這到題的作者肯定是面向對象設計的高手.---
題目我有點忘了但是我就是憑記憶想想--如果沒有猜錯的話狀態圖

題目大概意思:
因爲差差原因要設計一個Door有click,complete,timeout行爲在之間
在考試有他們的狀態的轉化圖.
但是今天我講的重點不是行爲的多少就用一個來講吧
那我就簡化題目來講吧
首先 看下圖---大家是不是覺的很簡單呀
還是以DOOR爲例他有兩個行爲就是click ,complete--重點以click

看到上圖大家也許和我一樣寫的下面的程序;

 public class Door
{
 
private final int OPEN=1;
 
private final int OPENING=2;
 
private final int CLOSED=3
 
private final int CLOSING=4;
 
private int state=closed;
 
public void setState(int state)

  
this.state=state;
}

 
public void  click()
 
{  
 
if(state==OPEN) setState(COLSEING)  ;
    
  
else if(state==CLOSED) setState(OPENING)
     

 }

public void  complete()
{
…….
…..

 }

}


今天看到考試的題目讓我清楚的知道
面向對象原來可以這樣的—讓if—else 判斷消失
這個就是好像一個武俠小說能飛就不想用走來快速的行使
可以達到同樣的目的
當然有的人認爲我用if—else不是很好寫起來簡單又好看又易懂寫的又快
這個表現爲初學者的心裏(--當然我也是初學者)但是你又沒有看到或者想到
如果if—else很多的時候你看的容易嗎//

讓我們來分析一下這個例子我們把一每個狀態抽象成一個類得到下圖:這個就是用的類的多態行性,根據Door的屬性State的不斷變化對應的狀態類的也隨之改

變這樣他門調用的同樣的方法的實現的功能的就不一樣的,

這樣就可以達到動態調用就可以和if--else一樣的功能

實現的代碼:


 

public class Door 

public final DoorState CLOSED = new DoorClosed(this); 
public final DoorState OPENING = new DoorOpening(this); 
public final DoorState OPEN = new DoorOpen(this); 
public final DoorState CLOSING = new DoorClosing(this); 
public final DoorState STAYOPEN = new DoorStayOpen(this); 
private DoorState state = CLOSED; //設置傳輸門當前狀態
 public void setState(DoorState state)
this.state = state; }
 
public void getState()
//根據當前狀態輸出對應的狀態字符串 
System.out.println(state.getClass().getName()); }
 
public void click(){ state.click() ;}//發生click事件時進行狀態轉換 
complete(){
{
  state.complete();
 }

}


DoorState
----

public abstract DoorState

 
protected Door door;
 
public DoorState(Door door)
  
{   this.door=door;}
 
public abstract void click();
 
public abstract void complete();
 }




 DoorOpen
---


public  DoorOpen extends DoorState
{
  
public DoorOpen(Door door)
 
{
   
super(door);
  }

 
public void click()
 
{
    door.state
=door.OPENING;
  }


}


DoorClosed
----
public  DoorClosed extends DoorState
{
  
public DoorOpen(Door door)
 
{
   
super(door);
  }

 
public void click()
 
{
    door.state
=doorCLOSING;
  }


}


..... 
 

下面的類多差不多就不多寫了
 

 

 


 

最後總結:將if else用在小地方還可以,如簡單的數值判斷;但是如果按照你的傳統習慣思維,在實現業務功能時也使用if else,那麼說明你的思維可能需要重塑,你的編程經驗越豐富,傳統過程思維模式就容易根深蒂固,想靠自己改變很困難;建議接受專業頭腦風暴培訓。

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