Hướng dẫn triển khai State Design Pattern trong Java
3 phút đọc06/09/2025
Về tác giả
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
{"success":true,"head":"<title>Hướng dẫn triển khai State Design Pattern trong Java - CyStack Tutorial</title>\n<meta name=\"description\" content=\"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\"/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-video-preview:-1, max-image-preview:large\"/>\n<link rel=\"canonical\" href=\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Hướng dẫn triển khai State Design Pattern trong Java - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"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\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Java\" />\n<meta property=\"og:updated_time\" content=\"2026-08-03T17:21:35+07:00\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/06172831/trien-khai-state-design-pattern-trong-java.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/06172831/trien-khai-state-design-pattern-trong-java.jpg\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"State Design Pattern trong Java\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-09-06T17:29:49+07:00\" />\n<meta property=\"article:modified_time\" content=\"2026-08-03T17:21:35+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Hướng dẫn triển khai State Design Pattern trong Java - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"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\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/06172831/trien-khai-state-design-pattern-trong-java.jpg\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Bao Tran\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"3 minutes\" />\n<script type=\"application/ld+json\" class=\"rank-math-schema\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://blog.cystack.org/tutorial/#person\",\"name\":\"CyStack Tutorial\"},{\"@type\":\"WebSite\",\"@id\":\"https://blog.cystack.org/tutorial/#website\",\"url\":\"https://blog.cystack.org/tutorial\",\"name\":\"CyStack Tutorial\",\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https://s2.cystack.net/tutorial/06172831/trien-khai-state-design-pattern-trong-java.jpg\",\"url\":\"https://s2.cystack.net/tutorial/06172831/trien-khai-state-design-pattern-trong-java.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"State Design Pattern trong Java\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":\"1\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":\"2\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/category/java/\",\"name\":\"Java\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/\",\"name\":\"H\\u01b0\\u1edbng d\\u1eabn tri\\u1ec3n khai State Design Pattern trong Java\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/\",\"name\":\"H\\u01b0\\u1edbng d\\u1eabn tri\\u1ec3n khai State Design Pattern trong Java - CyStack Tutorial\",\"datePublished\":\"2025-09-06T17:29:49+07:00\",\"dateModified\":\"2026-08-03T17:21:35+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/06172831/trien-khai-state-design-pattern-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"name\":\"Bao Tran\",\"url\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/0cdd33c02ec4a531fcf557b9c1ccc276df0c69031b2382c959bcf335248e840c?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/0cdd33c02ec4a531fcf557b9c1ccc276df0c69031b2382c959bcf335248e840c?s=96&d=mm&r=g\",\"caption\":\"Bao Tran\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"H\\u01b0\\u1edbng d\\u1eabn tri\\u1ec3n khai State Design Pattern trong Java - CyStack Tutorial\",\"keywords\":\"State Design Pattern,m\\u1eabu thi\\u1ebft k\\u1ebf State,State pattern\",\"datePublished\":\"2025-09-06T17:29:49+07:00\",\"dateModified\":\"2026-08-03T17:21:35+07:00\",\"articleSection\":\"Java\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"name\":\"Bao Tran\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"State Design Pattern (m\\u1eabu thi\\u1ebft k\\u1ebf State) l\\u00e0 m\\u1ed9t trong c\\u00e1c m\\u1eabu thi\\u1ebft k\\u1ebf thu\\u1ed9c nh\\u00f3m h\\u00e0nh vi (behavioral design pattern). N\\u00f3 \\u0111\\u01b0\\u1ee3c s\\u1eed d\\u1ee5ng khi m\\u1ed9t \\u0111\\u1ed1i t\\u01b0\\u1ee3ng thay\",\"name\":\"H\\u01b0\\u1edbng d\\u1eabn tri\\u1ec3n khai State Design Pattern trong Java - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/06172831/trien-khai-state-design-pattern-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/06/trien-khai-state-design-pattern-trong-java/#webpage\"}}]}</script>\n"}
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
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 TV và tắ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.