觀察者模式(Observer)定義:java
觀察者模式(有時又被稱爲發佈(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式),一個目標物件管理全部相依於它的觀察者物件,而且在它自己的狀態改變時主動發出通知。這一般透過呼叫各觀察者所提供的方法來實現。此種模式一般被用來實現事件處理系統。git
類型:形爲型模式 github
順口溜:中訪策備迭 觀模命狀職解設計模式
package com.amosli.dp.behavior.observer; public abstract class Observer { abstract void update(); } package com.amosli.dp.behavior.observer; import java.util.ArrayList; import java.util.List; public abstract class Subject { private List<Observer> observers = new ArrayList<Observer>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObserver() { for (Observer observer : observers) { observer.update(); } } } package com.amosli.dp.behavior.observer; public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } } package com.amosli.dp.behavior.observer; public class ConcreteObserver extends Observer { private String name; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject, String name) { this.subject = subject; this.name = name; } private String observerState; public String getState() { return observerState; } public void setState(String state) { this.observerState = state; } @Override void update() { observerState = subject.getSubjectState(); System.out.println("觀察者:" + name + " 您訂閱的主題狀態有更新: " + observerState); } } package com.amosli.dp.behavior.observer; public class Client { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); subject.attach(new ConcreteObserver(subject,"xa")); subject.attach(new ConcreteObserver(subject,"xb")); subject.attach(new ConcreteObserver(subject,"xc")); subject.setSubjectState("amosli又更新了設計模式系列文章哦!"); subject.notifyObserver(); } }
輸出:ide
一、 對一個對象狀態的更新,須要其餘對象同步更新,並且其餘對象的數量動態可變。
二、 對象僅須要將本身的更新通知給其餘對象而不須要知道其餘對象的細節。 this
1)、 Subject和Observer之間是鬆偶合的,分別能夠各自獨立改變。
2)、 Subject在發送廣播通知的時候,無須指定具體的Observer,Observer能夠本身決定是否要訂閱Subject的通知。
3)、 遵照大部分GRASP原則和經常使用設計原則,高內聚、低偶合。spa
1)、若是一個被觀察者對象有不少的直接和間接的觀察者的話,將全部的觀察者都通知到會花費不少時間。設計
2)、 若是在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進 行循環調用,可能致使系統崩潰。code
3)、 觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化。orm
本系列文章源碼地址,https://github.com/amosli/dp 歡迎Fork & Star !!