30/08/2019, 10:47
Spring State Machine là gì
1. State machine là gì? State Machine là một mô hình tính toán dựa trên một máy giả định được tạo thành từ một hoặc nhiều trạng thái. Nó chuyển từ trạng thái này sang trạng thái khác để thực hiện các hành động khác nhau. 2. Khi nào ta nên sử dụng State machine ? Khi chúng ta muốn chia một ...
1. State machine là gì?
State Machine là một mô hình tính toán dựa trên một máy giả định được tạo thành từ một hoặc nhiều trạng thái. Nó chuyển từ trạng thái này sang trạng thái khác để thực hiện các hành động khác nhau.
2. Khi nào ta nên sử dụng State machine ?
Khi chúng ta muốn chia một nhiệm vụ lớn và phức tạp thành những đơn vị nhỏ độc lập.
3. Lợi ích của việc dùng state machine ?
* dễ dàng theo dõi quá trình chuyển đổi / dữ liệu / sự kiện nào gây ra trạng thái hiện tại của yêu cầu.* ngăn chặn các hoạt động câu lệnh trái phép.
* Bảo trì dễ dàng,quá trình chuyển đổi trạng thái độc lập nhau.
* Ổn định và dễ dàng thay đổi.
4. Công thức tính ?
Current State + Some Action / Event= Another State
State machine thực hiện theo State Design pattern. Ví dụ như sau:
- Giả sử Chúng ta đi mượn sách ở thư viện, những cuốn sách trên kệ sách là những cuốn có giá trị đọc và sử dụng (Available). Chúng ta có thể mượn (Borrow) sách, lúc này DB của thư viện sẽ lưu trạng thái Borrowed. Trường hợp nếu mà khi mượn mà làm rách sách thì chúng ta sẽ chịu thêm 1 số chi phí cho thư viện và lúc này thư viện sẽ mang đi sửa (Start repair) khi mang đi sửa xong sách có trạng thái là In_Repair. Trường hợp sửa xong (End Repair) mình mạn phép cho ở trạng thái Borrowed. Và Cuối cùng mượn xong thì chúng ta trả sách (Return) và sách trở thành trạng thái (Available) người đọc khác có thể mượn sách.
-
5. State Design pattern:
- Code:
public interface States { public void on(); public void off(); }
public class Available implements States { @Override public void on() { System.out.println("get from AVAILABLE to BORROWED"); } @Override public void off() { System.out.println("get from AVAILABLE to EMPTY STATE"); } }
public class Borrowed implements States{ @Override public void on() { System.out.println("get from BORROWED to IN_REPAIR"); } @Override public void off() { System.out.println("get from BORROWED to AVAILABLE"); } }
public class InRepair implements States{ @Override public void on() { // TODO Auto-generated method stub System.out.println("get from IN_REPAIR to IN_REPAIR"); } @Override public void off() { // TODO Auto-generated method stub System.out.println("get from IN_REPAIR to BORROWED"); } }
- Cuối cùng configure cho State của mình:
public class FiniteStateMachine { // 2. states private States[] states = {new Available(), new Borrowed(), new InRepair()}; // 4. transitions private int[][] transition = {{0,1}, {0,2}, {1,2}}; // 3. current private int current = 0; private void next(int msg) { current = transition[current][msg]; } // 5. All client requests are simply delegated to the current state object public void on() { states[current].on(); next(1); } public void off() { states[current].off(); next(0); } }
public class StateMachineMain { public static void main(String[] args) { FiniteStateMachine fsm = new FiniteStateMachine(); int[] msgs = {1, 1, 1, 0 , 1}; for (int msg : msgs) { if (msg == 1) { fsm.on(); } else if (msg == 0) { fsm.off(); } } } }
- Chương trình lúc này in ra :
get from AVAILABLE to BORROWED get from BORROWED to IN_REPAIR get from IN_REPAIR to EMPTY STATE get from IN_REPAIR to BORROWED get from BORROWED to IN_REPAIR
- theo công thức (3) thì chúng ta có :
- Events : Borrow, Start Repair, End Repair, Return;
- States: Available, Borrowed, InRepair
- VD: Available + (Events) Borrow = Borrowed
- Mỗi lần chuyển đổi từ trạng thái này sang trạng thái khác người ta gọi là Transitions
- ở đây mình quy ước On() là mũi tên hướng lên, Off() là mũi tên trở lại.
- Nhìn vào Sơ đồ thì ta thấy sự chuyển đổi trạng thái {1, 1, 1, 0 , 1}.Ban đầu là Available On() => trạng thái Borrowed. Borrowed On() chuyển sang IN_REPAIR...
- Phần tới mình sẽ giới thiệu về Spring state machine