1. 程式人生 > >大話設計模式之狀態模式

大話設計模式之狀態模式

狀態模式:當一個物件的內在狀態改變時 允許改變其行為,這個物件看起來像是改變了其類。 不懂!!!!!!!!!

狀態模式主要解決的是: 當控制一個物件狀態轉換的條件表示式過於複雜時的情況,(比如:當給這個物件一個吃的命令,他去 吃飯,睡覺的命令,他去睡覺。。。。),把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。 當然:如果這個狀態判斷很簡單,那就沒必要使用“狀態” 這樣一個需求:遙控器按不同得鍵,上 下  左 右,使遙控汽車 上 下左 右 跑。 如果按照面向物件,傳入不同得建,而執行不同得行為來控制物件。 具體得實現就不寫了,太簡單了。 我們看需求就可以看出:如果增加其他鍵,需要修改該物件,這明顯不符合 開放--封閉原則,而且,一個類多個方法,也不 符合  單一職責原則。

狀態模式得好處與用處 狀態模式得好處是:將與特定狀態相關得行為區域性化,並且將不同狀態得行為分割開來。也就是說:將特定得狀態相關得行為都放入一個物件 中,由於所有與狀態相關得程式碼都存在於 某個ConcreteState 中,所以通過定義新得子類可以很容易地增加新得狀態和轉換。 說白了,這樣做得目的就是為了 消除 龐大得條件 分支語句,狀態模式通過把各種狀態轉移邏輯分佈到State 得子類之間,來減少相互 間得依賴。 什麼時候使用狀態模式: 當一個物件得行為取決於他的狀態,並且它必須 在執行時刻 根據狀態改變它得行為時,就可以考慮使用狀態模式了。(一批資料進來,這批資料按照星期這個狀態來改變物件得行為)。

我們 通過一個需求來了解狀態模式:用程式碼根據不同時間 展示你一天得狀態(根據不同時間來才操作你這個物件得行為)

/**
 * 抽象狀態
 * */
public abstract class State {
	
public abstract void  WriteProgram(Work work);
}
/**上午*/
public class ShangWuState extends State{

	@Override
	public void WriteProgram(Work work) {
		// TODO Auto-generated method stub
		if (work.getHour()<12) {
			System.out.println("上午》》》》》"+work.getHour());
		}else {
			work.setState(new zhongwuState());
			work.WriteProgram();
		}
	}

}
/**
 * 中午
 * */
public class zhongwuState extends State{

	@Override
	public void WriteProgram(Work work) {
		// TODO Auto-generated method stub
	if (work.getHour()<13) {
		System.out.println("中午》》》》》》》"+work.getHour());
	}	else {
		work.setState(new xiawuState());
		work.WriteProgram();
	}
	}

}

public class xiawuState extends State{

	@Override
	public void WriteProgram(Work work) {
		// TODO Auto-generated method stub
		if (work.getHour()<17) {
			System.out.println("下午???????????"+work.getHour());
		}else {
			
		}
	}

}
public class wanshangState extends State{

	@Override
	public void WriteProgram(Work work) {
		if (work.isFinish()) {
//		任務完成,下班
			work.setState(new XiabanState());
			work.WriteProgram();
		}else {
			if (work.getHour()<21) {
				System.out.println("jiaban >>>>"+work.getHour());
			}else {
				work.setState(new SleepState());
				work.WriteProgram();
			}
		}
		// TODO Auto-generated method stub
//		System.out.println("晚上》》》》》》"+);
	}

}
public class XiabanState extends State {

	@Override
	public void WriteProgram(Work work) {
		// TODO Auto-generated method stub
		System.out.println("下班"+work.getHour());
	}

}
public class SleepState extends State{

	@Override
	public void WriteProgram(Work work) {
		// TODO Auto-generated method stub
		System.out.println("shuijiaole");
	}

}
/**
 * 一。work 類  工作類
 * */
public class Work {

	private State State;
	private double  hour;
	private boolean finish=false;
	public boolean isFinish() {
		return finish;
	}
	public void setFinish(boolean finish) {
		this.finish = finish;
	}
	public State getState() {
		return State;
	}
	public void setState(State state) {
		State = state;
	}
	public double getHour() {
		return hour;
	}
	public void setHour(double hour) {
		this.hour = hour;
	}
	
	public void WriteProgram() {
		State.WriteProgram(this);
	}
}
public class Test1 {
public static void main(String[] args) {
	Work work = new Work();
	work.setHour(9);
}
}