CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Mục lục

Trang chủBlogHướng dẫn triển khai Stat...
Java

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

3 phút đọc06/09/2025
CyStack Author
Bao Tran

Web Developer

0 lượt xem
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.

Về tác giả

Bao Tran
Bao TranWeb Developer

I’m passionate about web development and sharing my insights through articles, with over 8 years of experience. I hope these sharings inspire you and help build a strong web development community. @#@ Tôi đam mê phát triển web và chia sẻ những hiểu biết của mình thông qua các bài viết, với hơn 8 năm kinh nghiệm. Tôi hy vọng những chia sẻ này sẽ truyền cảm hứng cho các bạn và giúp xây dựng một cộng đồng phát triển web mạnh mẽ.

Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn

Thảo luận (0)

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

Bài viết liên quan