设计模式:状态模式(State)
生活随笔
收集整理的這篇文章主要介紹了
设计模式:状态模式(State)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/design_pattern/state/
允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
狀態模式的角色
案例
以酒店訂房為例,房間的狀態有:空閑、預訂、入住。那么空閑房間的狀態可以轉變為:預訂、入住。已預訂狀態房間的狀態可以轉變為:入住、取消預訂。已入住房間的狀態可以轉變為:退房
1 狀態接口State
2 房間類Room(環境角色)
public class Room {private State freeTimeState;private State checkInState;private State bookedState;private State state;public Room(){freeTimeState = new FreeTimeState(this);checkInState = new CheckInState(this);bookedState = new BookedState(this);state = freeTimeState;}public void bookRoom(){state.bookRoom();}public void unsubscribeRoom(){state.unsubscribeRoom();}public void checkInRoom(){state.checkInRoom();}public void checkOutRoom(){state.checkOutRoom();}public String toString(){return "該房間的狀態是:"+getState().getClass().getName();}public State getFreeTimeState(){return freeTimeState;}public void setFreeTimeState(State freeTimeState){this.freeTimeState = freeTimeState;}public State getCheckInState(){return checkInState;}public void setCheckInState(State checkInState){this.checkInState = checkInState;}public State getBookedState(){return bookedState;}public void setBookedState(State bookedState){this.bookedState = bookedState;}public State getState(){return state;}public void setState(State state){this.state = state;} }3 房間狀態(具體狀態角色)
空閑狀態
入住狀態
public class CheckInState implements State {private Room hotelManagement;public CheckInState(Room hotelManagement){this.hotelManagement = hotelManagement;}@Overridepublic void bookRoom(){System.out.println("該房間已經入住了");}@Overridepublic void unsubscribeRoom(){}@Overridepublic void checkInRoom(){System.out.println("該房間已經入住了");}@Overridepublic void checkOutRoom(){System.out.println("退房成功");this.hotelManagement.setState(this.hotelManagement.getFreeTimeState());} }預訂狀態
public class BookedState implements State {private Room hotelManagement;public BookedState(Room hotelManagement){this.hotelManagement = hotelManagement;}@Overridepublic void bookRoom(){System.out.println("該房間已經預定了");}@Overridepublic void unsubscribeRoom(){System.out.println("成功退訂");this.hotelManagement.setState(this.hotelManagement.getFreeTimeState());}@Overridepublic void checkInRoom(){System.out.println("入住成功");this.hotelManagement.setState(this.hotelManagement.getCheckInState());}@Overridepublic void checkOutRoom(){} }4 測試代碼
Room[] rooms = new Room[2];for(int i=0;i<rooms.length;i++){rooms[i] = new Room();}rooms[0].bookRoom();rooms[0].checkInRoom();rooms[0].bookRoom();System.out.println(rooms[0]);System.out.println("-------------");rooms[1].checkInRoom();rooms[1].bookRoom();rooms[1].checkOutRoom();rooms[1].bookRoom();System.out.println(rooms[1]);輸出:
您已經預定成功了! 入住成功 該房間已經入住了 該房間的狀態是:design.state.CheckInState ------------- 您已經入住了! 該房間已經入住了 退房成功 您已經預定成功了! 該房間的狀態是:design.state.BookedState優缺點
優點:
缺點:
適用場景
JDK中的狀態模式:
java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()
歡迎跳轉到本文的原文鏈接:https://honeypps.com/design_pattern/state/
參考資料
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的设计模式:状态模式(State)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式:观察者模式(Observer)
- 下一篇: 设计模式:访问者模式(Vistor)