Java設計模式之觀察者模式

觀察者模式也叫發佈訂閱模式,意思是:定義對象之間一對多的依賴關係,使得每當一個對象改變狀態時,則所有依賴於它的對象都得到通知並被自動更新。
觀察者模式(發佈訂閱模式)包含如下角色:

  • 抽象發佈者:可以增加、刪除、通知訂閱者;
  • 具體發佈者:抽象發佈者方法的具體實現;
  • 抽象訂閱者:定義一個接受通知的方法,在得到通知時更新自己的狀態;
  • 具體訂閱者:抽象訂閱者的具體實現。

下面以訂閱報紙爲例:

public interface INewsPaper {
    //添加訂閱者
    void add(IPerson iPerson);
    //刪除訂閱者
    void remove(IPerson iPerson);
    //通知所有訂閱者
    void notifyPersons();
}
public class NewsPaper implements INewsPaper {

    private List<IPerson> personList = new ArrayList<>();

    @Override
    public void add(IPerson iPerson) {
        personList.add(iPerson);
    }

    @Override
    public void remove(IPerson iPerson) {
        personList.remove(iPerson);
    }

    @Override
    public void notifyPersons() {
        for (IPerson person: personList) {
            person.update();
        }
    }
}
public interface IPerson {

    void update();
}

public class Person implements IPerson {
    @Override
    public void update() {
        System.out.println("我收到了通知");
    }
}
public class Test {

    public static void main(String[] args) {
        INewsPaper newsPaper = new NewsPaper();
        IPerson person = new Person();
        newsPaper.add(person);
        newsPaper.notifyPersons();
    }
}
我收到了通知

由上述代碼可知,在觀察者模式中,發佈者並不知道每一個訂閱者,它只知道訂閱者們的共同接口-抽象訂閱者,所以觀察者模式容易擴展,符合開閉原則。但是,如果訂閱者比較多時,每個通知會比較耗時。

觀察者模式的應用場景如下:

  • 關聯行爲的場景,比如:在一個系統中,如果用戶完善了個人資料,就會增加積分、開放更多權限等;
  • 消息隊列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章