1. 程式人生 > 其它 >面向物件(三大特性封裝與多型)

面向物件(三大特性封裝與多型)

     狀態模式有點類似於策略模式,但是策略模式中客戶端知道使用具體的哪一種策略 而狀態模式客戶端不知道內部狀態是如何變化的,內部狀態隨著客戶端傳遞進來的引數的變化而變化。 狀態模式隨時隨地都有可能發生變化,而策略模式一般情況下只會使用其中一種;

UML:

//封裝了所有的狀態
public enum StateEnum {
	CREATE(1L, "state.CreateOrderState"),
	PAY(2L, "state.PayOrderState"),
	DISPATCH(3L, "state.DispatchOrderState"),
	DONE(4L, "state.DoneOrderState");
	private Long status;
	private String clsName;
	private static final Map<Long, StateEnum> STATE_MAP;
	static {
		STATE_MAP = new HashMap<Long, StateEnum>();
		STATE_MAP.put(DISPATCH.status, DISPATCH);
		STATE_MAP.put(CREATE.status, CREATE);
		STATE_MAP.put(DONE.status, DONE);
		STATE_MAP.put(PAY.status, PAY);

	}

	private StateEnum(Long status, String clsName) {
		this.status = status;
		this.clsName = clsName;
	}
	/**
	 * 獲取
	 * @param status
	 * @return
	 */
	public static StateEnum getStateEnumByStatus(Long status){
		if(status == null)
			return null;
		
		return STATE_MAP.get(status);
		
	}





// 狀態變化的容器,外界不知道內部狀態如何變化
public class StateContainer{
	
	private State state;
	/**
	 * 
	 * @param status
	 * @throws Exception
	 */
	public void run(Long status) throws Exception {
		StateEnum state = StateEnum.getStateEnumByStatus(status);
		if (state == null || isEmpty(state.getClsName()))
		    throw new IllegalArgumentException("status illegal!");
		Class<?> cls = Class.forName(state.getClsName());
		this.state = (State) cls.newInstance();
		doBusiness();
	}

	

	private void doBusiness() {
		this.state.execute();
	}
	
	private boolean isEmpty(String str) {
		return str == null || str.length() == 0;
	}


//定義狀態的執行
public interface State {
	void execute();
}
//其中一個狀態的實現
public class PayOrderState implements State{

	@Override
    public void execute() {
	    System.out.println("支付成功,準備發貨.");
    }

}
//客戶端程式碼
StateContainer bo = new StateContainer();
		bo.run(1L);
		System.out.println("-----------");
		bo.run(2L);
		System.out.println("-----------");
		bo.run(3L);
		System.out.println("-----------");
		bo.run(4L);


控制檯:


訂單建立成功,請支付!
-----------
支付成功,準備發貨.
-----------
已發貨,做好收貨準備.
-----------
已收貨,訂單完成!