[Thực hành] Triển khai Observer

Behavioral Design Pattern

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

Leave a Reply

Your email address will not be published. Required fields are marked *