NỘI DUNG BÀI VIẾT
Mục tiêu
Luyện tập triển khai observer pattern.
Mô tả
Viết chương trình khi người dùng nhập vào một số nguyên, thực hiện chuyển đổi số nguyên sang các hệ số Hex, Oct, Binary. Việc chuyển đổi được thực hiện trên từng lớp HexObserver, OctObserver, BinObserver. Khi có bất cứ số nguyên nào được yêu cầu chuyển đổi sẽ gọi đế các lớp để thực thi.
Các bước làm
Bước 1: Tạo lớp trừu tượng Observer
Lớp gồm đối tượng Subject và phương thức trừu tượng update()
abstract class Observer { protected Subject subject; public abstract void update(); }
Bước 2: Tạo lớp Subject
Phương thức add() để thêm vào một observer.
Phương thức execute() để thông báo tới các observer thực hiện yêu cầu.
Phương thức setState(int value) để thiết đặt trạng thái chuyển đổi, khi đã xác định được giá trị chuyển đổi, gọi đến phương thức execute() để thực thi.
import java.util.ArrayList; import java.util.List; public class Subject { private List observers = new ArrayList<>(); private int state; public void add(Observer o) { observers.add(o); } public int getState() { return state; } public void setState(int value) { this.state = value; execute(); } private void execute() { for (Observer observer : observers) { observer.update(); } } }
Bước 3: Tạo lớp HexObserver kế thừa từ Observer thực hiện chuyển đổi từ số nguyên sang hệ hex
public class HexObserver extends Observer { public HexObserver(Subject subject) { this.subject = subject; this.subject.add(this); } public void update() { System.out.print(" " + Integer.toHexString(subject.getState())); } }
Bước 4: Tạo lớp OctObserver kế thừa từ Observer thực hiện chuyển đổi từ số nguyên sang hệ oct
public class OctObserver extends Observer { public OctObserver(Subject subject) { this.subject = subject; this.subject.add( this ); } public void update() { System.out.print(" " + Integer.toOctalString(subject.getState())); } }
Bước 5: Tạo lớp BinObserver kế thừa từ Observer thực hiện chuyển đổi từ số nguyên sang hệ binary
public class BinObserver extends Observer { public BinObserver(Subject subject) { this.subject = subject; this.subject.add(this); } public void update() { System.out.print(" " + Integer.toBinaryString(subject.getState())); } }
Bước 6: Tạo lớp ObserverDemo chứa phương thức main để thực thi chương trình.
Chương trình cho phép sử dụng vòng lặp để nhập 5 lần số nguyên liên tiếp. Mỗi lần nhập một số nguyên, thực hiện chuyển số nguyên này sang các hệ hex, oct, binary tương ứng.
import java.util.Scanner; public class ObserverDemo { public static void main(String[] args) { Subject sub = new Subject(); // Client configures the number and type of Observers new HexObserver(sub); new OctObserver(sub); new BinObserver(sub); Scanner scan = new Scanner(System.in); for (int i = 0; i < 5; i++) { System.out.print("\nEnter a number: "); sub.setState(scan.nextInt()); } } }
Bước 7: Chạy chương trình và quan sát kết quả.
Nguồn: https://github.com/codegym-vn/java-web-design-pattern-observer