面向物件(三大特性封裝與多型)
阿新 • • 發佈:2022-04-11
狀態模式有點類似於策略模式,但是策略模式中客戶端知道使用具體的哪一種策略 而狀態模式客戶端不知道內部狀態是如何變化的,內部狀態隨著客戶端傳遞進來的引數的變化而變化。 狀態模式隨時隨地都有可能發生變化,而策略模式一般情況下只會使用其中一種;
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); 控制檯: 訂單建立成功,請支付! ----------- 支付成功,準備發貨. ----------- 已發貨,做好收貨準備. ----------- 已收貨,訂單完成!