Friday, August 30, 2013

Design Pattern - Observer


Nó 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 .

  1. public interface Observer{
  2.    void update(String message);//phương thức phản ứng lại khi nhận được thông báo.
  3. }
Và lớp Customer sẽ triển khai interface trên :

  1. public class Customer implements Observer{
  2. private String name;
  3. private int age;
  4. public Customer(String name, int age) {
  5. super();
  6. this.name = name;
  7. this.age = age;
  8. }

  9. @Override
  10. public void update(String message) {
  11. System.out.println(name + " " + message);
  12. }

  13. }
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ý :

  1. public interface Subject {  
  2.     public void attachObserver(Observer observer);// thêm đối tượng đăng ký lắng nghe thông báo.
  3.     public void detachObserver(Observer observer);// hủy đối tượng đăng ký lắng nghe thông báo
  4.     public void notifyObserver();//thong bao đến tất cả các đối tượng đã đăng ký thông báo.
  5. }
Và class Product sẽ triển khai interface trên:

  1. public class Product implements Subject{
  2. private List<Observer> obs = new ArrayList<Observer>();
  3. private String nameProduct;
  4. public Product(String nameProduct) {
  5. super();
  6. this.nameProduct = nameProduct;
  7. }

  8. @Override
  9. public void attachObserver(Observer observer) {
  10. obs.add(observer);
  11. }

  12. @Override
  13. public void detachObserver(Observer observer) {
  14. obs.remove(observer);
  15. }

  16. @Override
  17. public void notifyObserver() {
  18. for(Observer ob : obs){
  19. ob.update(nameProduct);
  20. }
  21. }
  22. }
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:
  1. public class Main {
  2. public static void main(String[] args) {
  3. Customer cus1 = new Customer("Ti", 11);
  4. Customer cus2 = new Customer("Teo", 12);
  5. Product product1 = new Product("Laptop");
  6. product1.attachObserver(cus1);//cus1 dang ky phan ung khi có thông báo từ product
  7. product1.attachObserver(cus2);
  8. product1.notifyObserver();//thông báo đến tất cả các Observer.
  9. }
  10. }
Oke vậy đã xong Observer.

12 comments:

  1. Bài viết dễ hiểu. Nhưng sao sao ban không đưa ra luôn kết quả khi chạy cho hoàn chỉnh.
    Cảm ơn bạn.

    ReplyDelete
  2. This is an unprecedented article. Amazing insight you have on this, it's nice to find a website that details so much information about different artists.I am hoping the same best work from you in the future as well.
    Discount master app, Product discount master, autoketing app

    ReplyDelete
  3. I’d choose to make use of some with the content on my blog whether or not you don’t mind. I have visit so many time to this blog.Magnificent work.I trust you would not have reservations if I placed a link here?
    facebook live chat help facebook inbox, autoketing.com

    ReplyDelete
  4. autoketing
    Shipping Bar for Shopify
    Free shipping bar
    It’s amazing too pay a visit this site and reading the views of all mates about this article,
    while I aam also keen of getting knowledge.

    ReplyDelete
  5. You’ve made some decent points there. I looked on the internet for more information about the issue and found most people will go along with your views on this website.
    autoketing
    email with love download
    email with love by autoketing

    ReplyDelete
  6. I really admire the writer of this post, hoping that the article will be more noticeable.
    currency converter box free, currency converter app download, best autoketing app

    ReplyDelete
  7. Excellent read, I just passed this onto a colleague who was doing a little study on that. And he actually bought me lunch because I found it for him smile So let me rephrase that: Thanks for lunch
    Shell Shockers Game
    The-light-temple-fireboy-and-watergirl-2 Game
    Sling-drift Game

    ReplyDelete
  8. Your posts are the flower of the flock.I decided to add your blog to my bookmarks so I can return to it at a later date.
    game online Tomb Runner Mommy Elsa Baby Caring online game Blocky Craft Police Squad

    ReplyDelete
  9. This website basically beautiful points and things right.This was a wonderful site and I really enjoy it the data you shared.Cheers for sharing with us your wonderful blog.
    Papa's Scooperia free game to play online game Def Island Blocky Rabbit Tower best free game

    ReplyDelete

  10. food games online
    basketball games free
    soccer free online
    This website basically beautiful points and things right.This was a wonderful site and I really enjoy it the data you shared.Cheers for sharing with us your wonderful blog.

    ReplyDelete
  11. free online juegos games
    io jogos
    2 player games for girl
    I used to happily find this web-site. I anticipated that would an obligation of appreciation is all together for your possibility for this remarkable learn!! I unequivocally getting a charge out of every single bit of it and I've you bookmarked to take a gander at new stuff you blog. Thanks

    ReplyDelete

  12. Frozen Baby Care
    Golf Is Hard
    Santa World Cup Pk
    I think this is a standout amongst the most critical data for me. What"s more, i"m happy perusing your article. Be that as it may, ought to comment on some broad things

    ReplyDelete