- vừa được xem lúc

[Design Patterns] State Pattern

0 0 15

Người đăng: Thịnh Trần

Theo Viblo Asia

State được sử dụng để triển khai phương thức hoạt động của một class tùy theo điều kiện cụ thể. Trong State, object chủ thể không chứa code triển khai của các phương thức hoạt động mà thay vào đó sẽ ủy thác tới các object State tương ứng với các trạng thái khác nhau của thực thể mà chúng ta muốn mô tả. State được xếp vào nhóm các pattern Hành Vi.

Áp dụng triển khai

sơ đồ các class

Ở đây chúng ta có một ví dụ về phiên bản desktop của phần mềm quản lý một trang blog nơi mọi người có thể đăng tải bài viết chia sẻ kiến thức. Sau khi người dùng đăng nhập và bắt đầu tạo một bài viết mới rồi nhấn nút "Lưu lại". Mặc định thì nút nhấn này sẽ lưu bài viết ở trạng thái "Bản nháp" và chỉ đến khi người viết bài thực hiện thao tác chọn "Công khai" thì bài viết mới được "Đăng tải". Như bạn thấy thì chức năng "Lưu lại" lúc này có cách thức hoạt động mang tính điều kiện và tùy thuộc vào trạng thái mà người dùng chọn để gắn nhãn cho bài viết.

Về mặt triển khai trong phần mềm, object Post mô tả thực thể là một bài viết được người dùng tạo ra. Tính năng save() của Post sẽ không chứa mã triển khai hành động thực thi cụ thể mà ủy thác cho các object State tương ứng với 2 trạng thái: bản nháp Draft và bài đã được đăng tải Published.

Bước 1

Tạo class Post mô tả thực thể bài viết và abstract State.

statepattern/Post.java

package statepattern; public class Post { private String title; private String author; private String body; private State state; public Post() { this.title = ""; this.author = ""; this.body = ""; state = new Draft(); } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public State getState() { return state; } public void setState(State state) { this.state = state; } public void save() { state.save(this); } public String toString() { return "Bài viết: " + title + "\n" + "Tác giả: " + author + "\n" + "Trạng thái: " + state.getName() + "\n" + "Nội dung: " + body; }
}

statepattern/State.java

package statepattern; public abstract class State { protected String name; public State(String name) { this.name = name; } public abstract void save(Post p); public String getName() { return name; }
}

Bước 2

Tạo 2 class trạng thái triển khai phương thức save().

statepattern/Draft.java

package statepattern; public class Draft
extends State { public Draft() { super("Bản nháp"); } @Override public void save(Post p) { System.out.println("Bài viết: " + p.getTitle() + " đã được lưu nháp."); }
}

statepattern/Published.java

package statepattern; public class Published
extends State { public Published() { super("Đã đăng tải"); } @Override public void save(Post p) { System.out.println("Bài viết: " + p.getTitle() + " đã được đăng tải."); }
}

Bước 3

Viết code main để kiểm tra hoạt động của các State.

PatternDemo.java

import statepattern.Post;
import statepattern.Published; public class PatternDemo { public static void main(String[] args) { Post p = new Post(); p.setTitle("State Pattern"); p.setAuthor("Semi Art"); p.setBody("Coming soon..."); p.save(); System.out.println("=============="); System.out.println(p); System.out.println("=============="); p.setTitle("[Design Patterns] State Pattern"); p.setBody("State có nghĩa là trạng thái."); p.setState(new Published()); p.save(); System.out.println("=============="); System.out.println(p); }
}

Bước 4

Kiểm chứng lại kết quả được in ra ở console.

console

Bài viết: State Pattern đã được lưu nháp.
==============
Bài viết: State Pattern
Tác giả: Semi Art
Trạng thái: Bản nháp
Nội dung: Coming soon...
==============
Bài viết: [Design Patterns] State Pattern đã được đăng tải.
==============
Bài viết: [Design Patterns] State Pattern
Tác giả: Semi Art
Trạng thái: Đã đăng tải
Nội dung: State có nghĩa là trạng thái.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Closure trong Javascript - Phần 2: Định nghĩa và cách dùng

Các bạn có thể đọc qua phần 1 ở đây. Để mọi người không quên, mình xin tóm tắt gọn lại khái niệm lexical environment:.

0 0 51

- vừa được xem lúc

Var vs let vs const? Các cách khai báo biến và hằng trong Javascript

Dạo này mình tập tành học Javascript, thấy có 2 cách khai báo biến khác nhau nên đã tìm tòi sự khác biệt. Nay xin đăng lên đây để mọi người đọc xong hy vọng phân biệt được giữa let và var, và sau đó là khai báo hằng bằng const.

0 0 31

- vừa được xem lúc

VueJS: Tính năng Mixins

Chào mọi người, hôm nay mình sẽ viết về Mixins và 1 số vấn đề trong sử dụng Mixins hay ho mà mình gặp trong dự án thực. Trích dẫn từ trang chủ của VueJS:.

0 0 27

- vừa được xem lúc

Asset Pipeline là cái chi chi?

Asset Pipeline. Asset pipeline là cái chi chi. . Giải thích:.

0 0 47

- vừa được xem lúc

Tạo data table web app lấy dữ liệu từ Google Sheets sử dụng Apps Script

Google Sheets là công cụ tuyệt vời để lưu trữ bảng tính trực tuyến, bạn có thể truy cập bảng tính bất kỳ lúc nào ở bất kỳ đâu và luôn sẵn sàng để chia sẻ với người khác. Bài này gồm 2 phần.

0 0 266

- vừa được xem lúc

Học Deep Learning trên Coursera miễn phí

Bạn muốn bắt đầu với Deep Learning nhưng không biết bắt đầu từ đâu? Bạn muốn có một công việc ở mức fresher về Deep Learning? Bạn muốn khoe bạn bè về kiến thức Deep Learning của mình. Bắt đầu từ đâu.

0 0 35