0
0
Lập trình
Admin Team
Admin Teamtechmely

Mẫu Observer trong Clprolf: Vai Trò Rõ Ràng cho Thông Báo

Đăng vào 4 giờ trước

• 5 phút đọc

Giới thiệu

Mẫu thiết kế là một phần không thể thiếu trong lập trình hướng đối tượng, giúp giải quyết các vấn đề lặp đi lặp lại. Trong bài viết này, chúng ta sẽ khám phá Mẫu Observer trong Clprolf. Đừng lo nếu bạn chưa quen với Clprolf; chúng ta sẽ sử dụng một trường hợp điển hình và giải pháp quen thuộc mà bạn đã biết.

Vấn đề cần giải quyết

Trong lập trình, bạn thường gặp tình huống có một đối tượng (Subject) có trạng thái thay đổi và nhiều Observers cần được thông báo tự động khi điều này xảy ra. Một số ví dụ điển hình bao gồm:

  • Một bảng giá cổ phiếu cập nhật nhiều bảng điều khiển khác nhau.
  • Một nút bấm kích hoạt nhiều trình lắng nghe.

Thách thức là:

  • Các Observers phải phản ứng mà không cần Subject biết chi tiết của chúng, để Subject có thể tập trung vào công việc của mình.

Giải pháp Clprolf

Trong Clprolf, chúng ta có:

  • Vai trò Observer là một version_inh agent.
  • Các Observers được khai báo bằng contracts.
  • Subject là một agent khai báo các observers của nó với with_compat.

Kết quả: ý định (ai quan sát ai) được thể hiện rõ ràng trong mã nguồn.

Ví dụ: Cập nhật giá cổ phiếu

Chúng ta sẽ mô hình hóa một Stock (Subject) và hai Observers:

  • PriceNotifier → một agent trung lập: không có logic kinh doanh, chỉ chuyển tiếp cho một worker.
  • TrendAnalyzer → một agent kinh doanh: áp dụng logic phân tích thực tế.

Cả hai đều phụ thuộc vào một DisplayWorker để xuất đầu ra kỹ thuật.

Mã Clprolf

java Copy
// 1) Vai trò Observer
public version_inh agent StockObserver {
    void update(int price);
}

// 2) Observer trung lập: không có logic kinh doanh, chỉ phân phối
public agent PriceNotifier contracts StockObserver {
    private with_compat DisplayWorker display;

    public PriceNotifier(with_compat DisplayWorker display) {
        this.display = display;
    }

    public void update(int price) {
        display.show("Giá hiện tại: " + price);
    }
}

// 3) Observer kinh doanh: áp dụng quy tắc (logic miền)
public agent TrendAnalyzer contracts StockObserver {
    private int lastPrice = -1;
    private with_compat DisplayWorker display;

    public TrendAnalyzer(with_compat DisplayWorker display) {
        this.display = display;
    }

    public void update(int price) {
        if (lastPrice != -1) {
            if (price > lastPrice) display.show("Xu hướng: TĂNG");
            else if (price < lastPrice) display.show("Xu hướng: GIẢM");
            else display.show("Xu hướng: ỔN ĐỊNH");
        }
        lastPrice = price;
    }
}

// 4) Worker kỹ thuật: xử lý I/O
public worker_agent DisplayWorker {
    public void show(String msg) {
        System.out.println(msg);
    }
}

// 5) Subject: quản lý trạng thái và observers
public agent Stock {
    private List<with_compat StockObserver> observers = new ArrayList<>();
    private int price;

    public void addObserver(with_compat StockObserver obs) { observers.add(obs); }
    public void removeObserver(with_compat StockObserver obs) { observers.remove(obs); }

    public void setPrice(int newPrice) {
        this.price = newPrice;
        notifyObservers();
    }

    private void notifyObservers() {
        for (with_compat StockObserver obs : observers) {
            obs.update(price);
        }
    }
}

// 6) Demo
public worker_agent ObserverDemo {
    public static void main(String[] args) {
        with_compat DisplayWorker display = new DisplayWorker();

        with_compat StockObserver notifier = new PriceNotifier(display);   // observer trung lập
        with_compat StockObserver analyzer = new TrendAnalyzer(display);  // observer kinh doanh

        Stock apple = new Stock();
        apple.addObserver(notifier);
        apple.addObserver(analyzer);

        apple.setPrice(100);
        apple.setPrice(105);
        apple.setPrice(103);
    }
}

Hai loại Observers

Lưu ý sự khác biệt:

  • PriceNotifier là một agent trung lập → không có logic miền, chỉ chuyển tiếp sự kiện cho một worker.
  • TrendAnalyzer là một agent kinh doanh → áp dụng quy tắc kinh doanh thực sự (phát hiện xu hướng TĂNG/GIẢM/ỔN ĐỊNH).

Cả hai đều là observers hợp lệ, nhưng vai trò của chúng được phân tách rõ ràng:

  • Logic miền trong các agents,
  • Thực thi kỹ thuật trong các workers.

Tại sao điều này rõ ràng trong Clprolf

  • version_inh agent StockObserver → cho thấy ngay rằng một Observer là một vai trò.
  • contracts → các observers cụ thể được ràng buộc bởi hợp đồng, không có sự mơ hồ.
  • with_compat → các phụ thuộc của Subject được khai báo rõ ràng như các observers.
  • worker_agent DisplayWorker → giữ các mối quan tâm kỹ thuật biệt lập.

Điểm chính

Trong Clprolf, Observer đơn giản là:

Khai báo một vai trò agent, triển khai các observers, và để Subject thông báo cho chúng.

Bạn có thể mô hình hóa các observers trung lập hoặc các nhà phân tích kinh doanh, và sự phân tách vai trò giúp hệ thống dễ hiểu và bảo trì hơn.

Ghi chú đổi mới: Mẫu thiết kế tiết lộ vai trò

Các mẫu thiết kế không chỉ là những thủ thuật kỹ thuật - chúng mang theo các vai trò ngụ ý:

  • Observer → một subject và các observers của nó.
  • Strategy → một ngữ cảnh và các quy tắc thay thế.
  • Adapter → một agent thích ứng.

Trong Clprolf, những vai trò này không bị ẩn giấu - chúng là từ khóa rõ ràng (agent, abstraction, worker_agent). Đó là lý do tại sao các mẫu thiết kế cảm thấy đơn giản và tự nhiên hơn ở đây.

Kết luận

Bài viết này đã trình bày một trường hợp sử dụng quen thuộc, giải pháp rõ ràng trong Clprolf và chứng minh rằng sự phân tách vai trò giúp các mẫu thiết kế trở nên tự giải thích. Hãy thử áp dụng Mẫu Observer trong dự án của bạn và trải nghiệm sự rõ ràng và dễ bảo trì mà nó mang lại!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào