?? r_state.java
字號:
/*
STATE—跟MM交往時,一定要注意她的狀態哦,在不同的狀態時她的行為會有不同,比如你約她今天晚上去看電影,對你沒興趣的MM就會說“有事情啦”,對你不討厭但還沒喜歡上的MM就會說“好啊,不過可以帶上我同事么?”,已經喜歡上你的MM就會說“幾點鐘?看完電影再去泡吧怎么樣?”,當然你看電影過程中表現良好的話,也可以把MM的狀態從不討厭不喜歡變成喜歡哦。
狀態模式:狀態模式允許一個對象在其內部狀態改變的時候改變行為。這個對象看上去象是改變了它的類一樣。狀態模式把所研究的對象的行為包裝在不同的狀態對象里,每一個狀態對象都屬于一個抽象狀態類的一個子類。狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每一個系統可能取得的狀態創立一個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。
狀態模式在工作流或游戲等各種系統中有大量使用,甚至是這些系統的核心功能設計,例如政府OA中,一個批文的狀態有多種:未辦;正在辦理;正在批示;正在審核;已經完成等各種狀態,使用狀態機可以封裝這個狀態的變化規則,從而達到擴充狀態時,不必涉及到狀態的使用者。
在網絡游戲中,一個游戲活動存在開始;開玩;正在玩;輸贏等各種狀態,使用狀態模式就可以實現游戲狀態的總控,而游戲狀態決定了游戲的各個方面,使用狀態模式可以對整個游戲架構功能實現起到決定的主導作用。
狀態模式實質:
使用狀態模式前,客戶端外界需要介入改變狀態,而狀態改變的實現是瑣碎或復雜的。
使用狀態模式后,客戶端外界可以直接使用事件Event實現,根本不必關心該事件導致如何狀態變化,這些是由狀態機等內部實現。
這是一種Event-condition-State,狀態模式封裝了condition-State部分。
每個狀態形成一個子類,每個狀態只關心它的下一個可能狀態,從而無形中形成了狀態轉換的規則。如果新的狀態加入,只涉及它的前一個狀態修改和定義。
*/
import java.awt.*;
import java.awt.event.*;
public class R_State{
public static void main(String args[]){
SafeFrame frame = new SafeFrame("State Sample");
while (true) {
for (int hour = 0; hour < 24; hour++) {
frame.setClock(hour); // 設定時間
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
}
interface Context {
public abstract void setClock(int hour); // 設定時間
public abstract void changeState(State state); // 狀態變化
public abstract void callSecurityCenter(String msg); // 呼叫保安中心
public abstract void recordLog(String msg); // 保安中心保留記錄
}
interface State {
public abstract void doClock(Context context, int hour); // 設定時間
public abstract void doUse(Context context); // 使用金庫
public abstract void doAlarm(Context context); // 警鈴
public abstract void doPhone(Context context); // 一般通話
}
class SafeFrame extends Frame implements ActionListener, Context {
private TextField textClock = new TextField(60); // 輸出現在時間
private TextArea textScreen = new TextArea(10, 60); // 輸出保安中心
private Button buttonUse = new Button("使用金庫"); // 使用金庫的按鍵
private Button buttonAlarm = new Button("警鈴"); // 警鈴的按鍵
private Button buttonPhone = new Button("一般通話"); // 一般通話的按鍵
private Button buttonExit = new Button("結束"); // 結束的按鍵
private State state = DayState.getInstance(); // 現在狀態
// 構造子
public SafeFrame(String title) {
super(title);
setBackground(Color.lightGray);
setLayout(new BorderLayout());
// 輸出textClock
add(textClock, BorderLayout.NORTH);
textClock.setEditable(false);
// 輸出textScreen
add(textScreen, BorderLayout.CENTER);
textScreen.setEditable(false);
// 把按鍵放到面板上
Panel panel = new Panel();
panel.add(buttonUse);
panel.add(buttonAlarm);
panel.add(buttonPhone);
panel.add(buttonExit);
// 輸出面板
add(panel, BorderLayout.SOUTH);
// 輸出到畫面上
pack();
show();
// 設定命令監聽者
buttonUse.addActionListener(this);
buttonAlarm.addActionListener(this);
buttonPhone.addActionListener(this);
buttonExit.addActionListener(this);
}
// 若有人按下按鍵,則跳到這里
public void actionPerformed(ActionEvent e) {
System.out.println("" + e);
if (e.getSource() == buttonUse) { // 使用金庫的按鍵
state.doUse(this);
} else if (e.getSource() == buttonAlarm) { // 警鈴的按鍵
state.doAlarm(this);
} else if (e.getSource() == buttonPhone) { // 一般通話的按鍵
state.doPhone(this);
} else if (e.getSource() == buttonExit) { // 結束的按鍵
System.exit(0);
} else {
System.out.println("?");
}
}
// 設定時間
public void setClock(int hour) {
String clockstring = "現在時間是";
if (hour < 10) {
clockstring += "0" + hour + ":00";
} else {
clockstring += hour + ":00";
}
System.out.println(clockstring);
textClock.setText(clockstring);
state.doClock(this, hour);
}
// 狀態變化
public void changeState(State state) {
System.out.println("狀態已經從" + this.state + "變成" + state + "。");
this.state = state;
}
// 呼叫保安中心
public void callSecurityCenter(String msg) {
textScreen.append("call! " + msg + "\n");
}
// 保安中心保留記錄
public void recordLog(String msg) {
textScreen.append("record ... " + msg + "\n");
}
}
class NightState implements State {
private static NightState singleton = new NightState();
private NightState() { // 構造子為private
}
public static State getInstance() { // 取得唯一的實例
return singleton;
}
public void doClock(Context context, int hour) { // 設定時間
if (9 <= hour && hour < 17) {
context.changeState(DayState.getInstance());
}
}
public void doUse(Context context) { // 使用金庫
context.callSecurityCenter("異常:晚間使用金庫!");
}
public void doAlarm(Context context) { // 警鈴
context.callSecurityCenter("警鈴(晚間)");
}
public void doPhone(Context context) { // 一般通話
context.recordLog("晚間的通話錄音");
}
public String toString() { // 輸出字串
return "[晚間]";
}
}
class DayState implements State {
private static DayState singleton = new DayState();
private DayState() { // 構造子為private
}
public static State getInstance() { // 取得唯一的實例
return singleton;
}
public void doClock(Context context, int hour) { // 設定時間
if (hour < 9 || 17 <= hour) {
context.changeState(NightState.getInstance());
}
}
public void doUse(Context context) { // 使用金庫
context.recordLog("使用金庫(白天)");
}
public void doAlarm(Context context) { // 警鈴
context.callSecurityCenter("警鈴(白天)");
}
public void doPhone(Context context) { // 一般通話
context.callSecurityCenter("一般的通話(白天)");
}
public String toString() { // 輸出字串
return "[白天]";
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -