觀察者模式也叫發佈訂閱模式,意思是:定義對象之間一對多的依賴關係,使得每當一個對象改變狀態時,則所有依賴於它的對象都得到通知並被自動更新。
觀察者模式(發佈訂閱模式)包含如下角色:
- 抽象發佈者:可以增加、刪除、通知訂閱者;
- 具體發佈者:抽象發佈者方法的具體實現;
- 抽象訂閱者:定義一個接受通知的方法,在得到通知時更新自己的狀態;
- 具體訂閱者:抽象訂閱者的具體實現。
下面以訂閱報紙爲例:
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();
}
}
我收到了通知
由上述代碼可知,在觀察者模式中,發佈者並不知道每一個訂閱者,它只知道訂閱者們的共同接口-抽象訂閱者,所以觀察者模式容易擴展,符合開閉原則。但是,如果訂閱者比較多時,每個通知會比較耗時。
觀察者模式的應用場景如下:
- 關聯行爲的場景,比如:在一個系統中,如果用戶完善了個人資料,就會增加積分、開放更多權限等;
- 消息隊列