2013-01-21 19 views
11

Tôi hiểu rằng State pattern có thể được sử dụng để mô hình hóa các đối tượng thay đổi hành vi tùy thuộc vào trạng thái và các trạng thái khác nhau mà Context có thể có được đóng gói trong các lớp cụ thể đại diện cho giao diện State. Điều tôi không rõ ràng là sự chuyển đổi trạng thái xảy ra như thế nào trong mô hình này. Cá nhân states có biết và quyết định ai theo dõi họ hay là Context quyết định trạng thái nào sẽ tiếp theo?Ai xác định chuyển tiếp trạng thái trong mẫu trạng thái?

Trả lời

9

Từ Patterns cuốn sách GOF Thiết kế (Điều này là có trong phần thực hiện):

1. Ai xác định chuyển trạng thái? Mẫu trạng thái không xác định người tham gia nào xác định các tiêu chí cho quá trình chuyển đổi trạng thái. Nếu các tiêu chí được sửa, thì chúng có thể được thực hiện hoàn toàn trong Bối cảnh. Nói chung, nó linh hoạt hơn và thích hợp hơn, để cho các Tiểu nhóm tự xác định trạng thái kế thừa của chúng và khi nào để chuyển tiếp. Điều này đòi hỏi phải thêm một giao diện vào bối cảnh cho phép các đối tượng trạng thái đặt trạng thái hiện tại của Context một cách rõ ràng.

Phân cấp logic chuyển tiếp theo cách này giúp dễ dàng sửa đổi hoặc mở rộng logic bằng cách xác định các lớp con mới của Tiểu bang. Một bất lợi của việc phân quyền là một phân lớp của Tiểu bang sẽ có kiến ​​thức về ít nhất một lớp con khác, giới thiệu các phụ thuộc triển khai thực hiện giữa các lớp con.

4

Có thể là ví dụ tương đối cụ thể có thể làm rõ. Tôi hy vọng tôi hiểu chính xác nó

Giả sử một máy giặt có hai trạng thái (BẬT, Tắt). Sau GOF từ vựng:

  • Context => WashingMachine
  • Nhà nước => WashingMachineState
  • bang bê tông => StateOn, StateOff

Đối với chuyển trạng thái, thông qua các lớp con nhà nước (trong trường hợp của chúng tôi StateOn và StateOff), chúng tôi cần phải có một phương pháp để thay đổi bối cảnh của tiểu bang:

class WashingMachine { 
    WashingMachineState state; 
    ... 
    protected void setState(WashingMachineState newState) { 
     state = newState; 
    } 

    someMethod() { 
     ... 
     state.pushStartButton(this); 
     ... 
    } 
} 
abstract class WashingMachineState { 
    protected void run(); 
    protected void pushStartButton(WashingMachine wm); 
} 
class StateOn extends WashingMachineState { 
    ... 
    void pushStartButton(WashingMachine wm) { 
     wm.setState(new StateOff()) 
    } 
} 

class StateOff extends WashingMachineState { 
    ... 
    void pushStartButton(WashingMachine wm) { 
     wm.setState(new StateOn()) 
    } 
} 

Chỉ cần giữ trong tâm trí có một số cách để thực hiện nó, sáng tạo giúp!