天天看點

設計模式——觀察者模式

1. 介紹

當對象間存在一對多關系時,則使用觀察者模式(Observer Pattern)

當一個對象被修改時,則會自動通知它的依賴對象(廣播)。觀察者模式屬于行為型模式。

2. 類定義

設計模式——觀察者模式

定義觀察者接口和被觀察者抽象類

public interface Observer {
    void update(String msg);
}      
public abstract class Observerable {
    final List<Observer>  observerList = new ArrayList<>();
    void registerObserver(Observer observer) {}
    void removeObserver(Observer observer) {}
    void notifyObserver(String msg) {}
}      

定義實作被觀察者的具體類

public class WechatServer extends Observerable{
    @Override
    public void registerObserver(Observer observer) {
        if (!observerList.contains(observer)) {
            observerList.add(observer);
            System.out.println("add " + observer + " success");
        }
    }

    @Override
    public void removeObserver(Observer observer) {
        if (!observerList.isEmpty()) {
            observerList.remove(observer);
            System.out.println("remove " + observer + " sucess");
        }
    }

    @Override
    public void notifyObserver(String msg) {
        for (Observer observer : observerList) {
            observer.update(msg);
        }
    }
}      

定義實作觀察者的2個具體類

public class PhoneObserver implements Observer{
    @Override
    public void update(String msg) {
        System.out.println("phone receive:" + msg);
    }
}      
public class BookObserver implements Observer{
    @Override
    public void update(String msg) {
        System.out.println("Book receive " + msg);
    }
}      

3.測試

public class ObserverTest {
    public static void main(String[] args) {
        Observerable observerable = new WechatServer();
        Observer phone = new PhoneObserver();
        Observer book = new BookObserver();
        observerable.registerObserver(phone);
        observerable.registerObserver(book);

        observerable.notifyObserver("hello world");

        observerable.removeObserver(book);
        observerable.notifyObserver("the second try");

        observerable.removeObserver(book);
        observerable.notifyObserver("the second try");

    }
}      

結果

add com.jihite.ObserverPattern.PhoneObserver@5674cd4d success
add com.jihite.ObserverPattern.BookObserver@63961c42 success
phone receive:hello world
Book receive hello world
remove com.jihite.ObserverPattern.BookObserver@63961c42 sucess
phone receive:the second try
remove com.jihite.ObserverPattern.BookObserver@63961c42 sucess
phone receive:the second try      

4.總結

優點: 

  • 觀察者和被觀察者是抽象耦合的
  • 建立一套觸發機制

缺點

  • 如果一個被觀察者對象有很多的直接和間接的觀察者的話,将所有的觀察者都通知到會花費很多時間。
  • 如果在被觀察者之間有循環依賴的話,被觀察者會觸發它們之間進行循環調用,導緻系統崩潰。在使用觀察者模式是要特别注意這一點
  • 雖然觀察者模式可以随時使觀察者知道所觀察的對象發生了變化,但是觀察者模式沒有相應的機制使觀察者知道所觀察的對象是怎麼發生變化的