Trang chủHướng dẫnHướng dẫn triển khai State Design Pattern trong Java
Java

Hướng dẫn triển khai State Design Pattern trong Java

CyStack blog 3 phút để đọc
CyStack blog06/09/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 3 minutes

State Design Pattern (mẫu thiết kế State) là một trong các mẫu thiết kế thuộc nhóm hành vi (behavioral design pattern). Nó được sử dụng khi một đối tượng thay đổi hành vi dựa trên trạng thái nội bộ của nó.

State Design Pattern trong Java

State Design Pattern

Khi cần thay đổi hành vi của một đối tượng dựa trên trạng thái hiện tại, chúng ta có thể thêm một biến trạng thái (state variable) vào đối tượng, rồi sử dụng khối điều kiện if-else để thực thi các hành động khác nhau tùy theo trạng thái đó. Mẫu thiết kế State đưa ra một cách tiếp cận có hệ thống và sử dụng liên kết lỏng để đạt được điều này thông qua Context và các lớp triển khai State.

Lớp Context giữ tham chiếu tới một trong các triển khai cụ thể của State, và chuyển tiếp các yêu cầu cho đối tượng State tương ứng xử lý.

Ví dụ, giả sử chúng ta muốn tạo một bộ điều khiển TV (TV Remote) với một nút bấm đơn giản: nếu trạng thái là ON, TV sẽ bật, còn nếu trạng thái là OFF, TV sẽ tắt. Cách tiếp cận cơ bản là dùng câu lệnh if-else như sau:

TVRemoteBasic.java

package com.journaldev.design.state;

public class TVRemoteBasic {

    private String state = "";

    public void setState(String state) {
        this.state = state;
    }

    public void doAction() {
        if (state.equalsIgnoreCase("ON")) {
            System.out.println("TV is turned ON");
        } else if (state.equalsIgnoreCase("OFF")) {
            System.out.println("TV is turned OFF");
        }
    }

    public static void main(String args[]) {
        TVRemoteBasic remote = new TVRemoteBasic();

        remote.setState("ON");
        remote.doAction();

        remote.setState("OFF");
        remote.doAction();
    }

}

Lưu ý, mã phía client phải biết chính xác giá trị cần dùng để đặt trạng thái của remote. Hơn nữa, nếu số lượng trạng thái tăng lên, sự phụ thuộc chặt chẽ giữa phần triển khai và mã client sẽ khiến việc bảo trì và mở rộng trở nên khó khăn.

Bây giờ, chúng ta sẽ sử dụng mẫu thiết kế State để triển khai ví dụ TV Remote ở trên.

Giao diện State Design Pattern

Trước hết, chúng ta tạo một interface State định nghĩa phương thức mà các lớp trạng thái cụ thể và lớp Context sẽ triển khai.

State.java

package com.journaldev.design.state;

public interface State {

    public void doAction();
}

Các triển khai Concrete State

Trong ví dụ này, chúng ta có thể có hai trạng thái: bật TVtắt TV. Do đó, sẽ tạo hai lớp triển khai cụ thể cho các hành vi này.

TVStartState.java

package com.journaldev.design.state;

public class TVStartState implements State {

    @Override
    public void doAction() {
        System.out.println("TV is turned ON");
    }

}

TVStopState.java

package com.journaldev.design.state;

public class TVStopState implements State {

    @Override
    public void doAction() {
        System.out.println("TV is turned OFF");
    }

}

Bây giờ chúng ta đã sẵn sàng triển khai đối tượng Context, đối tượng này sẽ thay đổi hành vi của mình dựa trên trạng thái nội bộ.

Triển khai lớp Context trong State Design Pattern

TVContext.java

package com.journaldev.design.state;

public class TVContext implements State {

    private State tvState;

    public void setState(State state) {
        this.tvState = state;
    }

    public State getState() {
        return this.tvState;
    }

    @Override
    public void doAction() {
        this.tvState.doAction();
    }

}

Lưu ý, lớp Context cũng triển khai State, giữ một tham chiếu đến trạng thái hiện tại và chuyển tiếp yêu cầu đến triển khai State đó.

Chương trình kiểm thử State Design Pattern

Bây giờ, hãy viết một chương trình đơn giản để kiểm thử việc triển khai mẫu State cho TV Remote.

TVRemote.java

package com.journaldev.design.state;

public class TVRemote {

    public static void main(String[] args) {
        TVContext context = new TVContext();
        State tvStartState = new TVStartState();
        State tvStopState = new TVStopState();

        context.setState(tvStartState);
        context.doAction();

        context.setState(tvStopState);
        context.doAction();
    }

}

Kết quả của chương trình trên giống với cách triển khai TV Remote cơ bản không dùng mẫu State.

Lợi ích của State Design Pattern

Áp dụng mẫu State để triển khai hành vi đa hình (polymorphic behavior) giúp giảm nguy cơ phát sinh lỗi và cho phép bổ sung trạng thái mới một cách dễ dàng, từ đó làm cho mã nguồn mạnh mẽ hơn, dễ bảo trì và linh hoạt hơn.

Bên cạnh đó, mẫu State còn loại bỏ nhu cầu sử dụng if-else hoặc switch-case trong trường hợp này.

Mẫu State có nhiều điểm tương đồng với mẫu Strategy, bạn có thể tham khảo Mẫu Strategy trong Java (Strategy Pattern in Java) để so sánh.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất