State Pattern tinh gọn với Sealed Classes trong Java 17+
State Pattern cho phép một đối tượng thay đổi hành vi của nó khi trạng thái nội bộ của nó thay đổi. Đối tượng sẽ xuất hiện như thể thay đổi class của nó.
Kiến trúc tổng quan của State Pattern:
Legacy State Pattern
Trạng thái truyền thống yêu cầu các lớp con nắm giữ tham chiếu ngược tới Context và tự ý chuyển đổi trạng thái, gây ra mối liên kết vòng (circular dependency) phức tạp.
Cách tiếp cận hiện đại với Sealed Types và Pattern Matching
Ta có thể biểu diễn các State là một Sealed Type hierarchy, biến Context thành một đối tượng bất biến hoặc đơn giản hóa việc chuyển đổi trạng thái bằng cách tập trung logic chuyển đổi tại một nơi:
public sealed interface OrderState permits NewOrder, ShippedOrder, DeliveredOrder {}
public record NewOrder(String orderId) implements OrderState {}
public record ShippedOrder(String orderId, String trackingCode) implements OrderState {}
public record DeliveredOrder(String orderId, java.time.Instant deliveredAt) implements OrderState {}
// Logic xử lý hành vi dựa trên trạng thái hiện tại:
public class OrderContext {
private OrderState state;
public void proceed() {
this.state = switch (this.state) {
case NewOrder n -> new ShippedOrder(n.orderId(), "TRACK-123");
case ShippedOrder s -> new DeliveredOrder(s.orderId(), java.time.Instant.now());
case DeliveredOrder d -> d; // Trạng thái cuối cùng
};
}
}
Điểm mạnh: Tránh các tham chiếu chéo chằng chịt, dễ dàng theo dõi toàn bộ máy trạng thái (FSM) tại một switch expression duy nhất.
Bình luận (0)
Đang tải bình luận...