定義對(duì)象之間的一種一對(duì)多依賴關(guān)系,使得每一個(gè)對(duì)象發(fā)生狀態(tài)的變化時(shí),其相關(guān)依賴對(duì)象皆得到通知并被自動(dòng)更新,又稱為發(fā)布-訂閱模式、模型-視圖模式、源-監(jiān)聽器模式或從屬者模式。
當(dāng)對(duì)象間存在一對(duì)多關(guān)系時(shí),則使用觀察者模式(Observer Pattern)。比如,當(dāng)一個(gè)對(duì)象被修改時(shí),則會(huì)自動(dòng)通知依賴它的對(duì)象。觀察者模式屬于行為型模式。
結(jié)構(gòu)圖
結(jié)角色與理解
- 觀察者模式共分為四種角色:
- Subject(目標(biāo)類):被觀察的對(duì)象,內(nèi)部定義一個(gè)觀察者集合,并提供管理方法,定義通知方法notify()。
- ConcreteSubject(具體目標(biāo)類):繼承目標(biāo)類,實(shí)現(xiàn)notify中具體的方法,可省略。
- Observer(觀察者):對(duì)目標(biāo)類做出的變化進(jìn)行反應(yīng),一般為接口,聲明更新方法update()。
- ConcreteObserver(具體觀察者):繼承觀察者,一般持有指向具體目標(biāo)類的引用,實(shí)現(xiàn)update方法,調(diào)用具體 目標(biāo)類完成具體的業(yè)務(wù)操作。
- 首先對(duì)目標(biāo)類和觀察者進(jìn)行抽象以便后期對(duì)程序進(jìn)行擴(kuò)展,目標(biāo)類持有觀察者的引用,實(shí)現(xiàn)自身變化時(shí)對(duì)觀察者更新方法的調(diào)用。
核心代碼
? 目標(biāo)類
public abstract class AbstractSubject {
protected List< Observer > observers = new ArrayList< >();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public abstract void notify(Object args);
}
? 具體目標(biāo)類
public class ConcreteSubject extends AbstractSubject {
@Override
public void notify(Object args) {
System.out.println("目標(biāo)類更改了狀態(tài)");
for (Observer observer : this.observers) {
observer.update();
}
}
}
? 觀察類
public interface Observer {
void update();
}
? 具體觀察類
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConcreteObserver implements Observer {
private String name;
@Override
public void update() {
System.out.println(this.name + "已更新");
}
}
? 客戶端
public class Client {
public static void main(String[] args) {
AbstractSubject as = new ConcreteSubject();
as.attach(new ConcreteObserver("觀察者A"));
as.attach(new ConcreteObserver("觀察者B"));
as.attach(new ConcreteObserver("觀察者C"));
as.notify("");
}
}
-
監(jiān)聽器
+關(guān)注
關(guān)注
0文章
11瀏覽量
14465
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論