[Tut 5 - Design Pattern] Observer

Pattern Observer là gì ?

Observer cho phép các đối tượng có thể lắng nghe và phản ứng khi có thông báo từ một đối tượng khác. Tức là khi một đối tượng gửi một thông báo, các đối tượng lắng nghe nó có thể phản ứng lại với thông báo đó.


Sử dụng khi nào ?

Khi bạn muốn các đối tượng liên lạc với nhau. Khi đối tượng này gửi 1 thông điệp thì các đối tượng đăng ký lắng nghe thông điệp sẽ phản ứng lại với thông điệp đó. Đối tượng gửi thông điệp sẽ không cần biết nó sẽ gửi cho ai và đối tượng nhận thông điệp sẽ không cần biết ai gửi thông điệp đó.

Dùng nó như thế nào?

Giả sử trong một hệ thống bán hàng, mỗi khi có sản phẩm mới hệ thống sẽ thông báo cho tất cả các khách hàng quan tâm đến sản phẩm này. Đầu tiên tôi tạo ra một lớp interface với 1 phương thức sẽ phản ứng khi có sản phẩm mới.
public interface Observer {    
    void update(String message);    // phương thức phản ứng lại khi nhận được thông báo.
}

Và lớp Customer sẽ triển khai interface trên:
public class Customer implements Observer {    
    private String name;
    private int age;
 
 
    public Customer(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
 
 
    @Override
    public void update(String message) {
        System.out.println(name + " " + message);
    }
}

Tiếp theo tạo một interface với các phương thức, cho phép đối tượng Observer đăng ký phản ứng, hủy đăng ký nhận, và thông báo đến tất cả các đối tượng Observer đã đăng ký:
public interface Subject {    
    public void attachObserver(Observer observer);// thêm đối tượng đăng ký lắng nghe thông báo.
 
 
    public void detachObserver(Observer observer);// hủy đối tượng đăng ký lắng nghe thông báo
 
 
    public void notifyObserver();// thong bao đến tất cả các đối tượng đã đăng ký thông báo.
     
}

Và class Product sẽ triển khai interface trên:
public class Product implements Subject {    
    private List obs = new ArrayList();
    private String nameProduct;
 
 
    public Product(String nameProduct) {
        super();
        this.nameProduct = nameProduct;
    }
 
 
    @Override
    public void attachObserver(Observer observer) {
        obs.add(observer);
    }
 
 
    @Override
    public void detachObserver(Observer observer) {
        obs.remove(observer);
    }
 
 
    @Override
    public void notifyObserver() {
        for (Observer ob : obs) {
            ob.update(nameProduct);
        }
    }
}

Ok đến đây ta đã có một class có thể thông báo đến các observer và observer sẽ phản ứng lại với thông báo này. Tạo hàm main như sau:
public class Main {    
    public static void main(String[] args) {
         
        Customer cus1 = new Customer("Ti", 11);
        Customer cus2 = new Customer("Teo", 12);
        Product product1 = new Product("Laptop");
        product1.attachObserver(cus1);// cus1 dang ky phan ung khi có thông báo
                                        // từ product
        product1.attachObserver(cus2);
        product1.notifyObserver();// thông báo đến tất cả các Observer.
    }
}

Nhận xét

Bài đăng phổ biến từ blog này

Base64 image – Lợi hay hại?

Hàm "tap" trong Laravel Collection