1.定義
觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)消息發(fā)布對(duì)象。 這個(gè)發(fā)布者對(duì)象在狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象或者指定的對(duì)象,使它們能夠收到對(duì)應(yīng)的消息并且對(duì)消息進(jìn)行處理或者執(zhí)行對(duì)應(yīng)的操作聋袋。
2.UML類圖
image
3.角色介紹
Subject:抽象被觀察者,定義了觀察者的集合,提供添加刪除通知觀察者的接口
Observer:抽象觀察者,定義了消息更新的接口
4.代碼實(shí)現(xiàn)
4.1抽象被觀察者實(shí)現(xiàn)
public interface ISubject<M>{
void attach(IObserver iObserver);
void dettach(IObserver iObserver);
void notifyObserver(M message);
}
4.2抽象觀察者實(shí)現(xiàn)
public interface IObserver<M>{
void update(M message);
}
4.3具體被觀察者實(shí)現(xiàn)
public class Subject implements ISubject<Message>{
private List<IObserver> observerList=new ArrayList<>();
@override
public void attach(IObserver iObserver){
if(iObserver!=null&&!observerList.contains(iObserver)){
observerList.add(iObserver);
}
}
@override
public void dettach(IObserver iObserver){
observerList.remove(iObserver);
}
@override
public void notifyObserver(M message){
for(IObserver iObserver:observerList){
iObserver.update(message);
}
}
}
4.4觀察者實(shí)現(xiàn)
public class Observer implements IObserver<Message>{
public void update(M message){
System.out.println(message);
}
}
4.5具體應(yīng)用
public class Client {
public static void main(String[] args){
Observer observer=new Observer();
Subject subject=new Subject();
subject.attach(observer);
subject.notifyObserver("觀察者模式測(cè)試");
}
}
5.應(yīng)用場(chǎng)景
1.當(dāng)一個(gè)對(duì)象的改變需要通知其它對(duì)象改變時(shí)。
2..跨系統(tǒng)的消息交換場(chǎng)景穴吹,如消息隊(duì)列幽勒、事件總線的處理機(jī)制。
6.優(yōu)點(diǎn)
1.依賴于抽象而不是具體,低耦合,需要監(jiān)聽(tīng)時(shí)只需要實(shí)現(xiàn)對(duì)應(yīng)的接口,并實(shí)現(xiàn)實(shí)現(xiàn)消息接收的方法
2.易于擴(kuò)展,符合開(kāi)放原則
7.缺點(diǎn)
1.觀察者和被觀察者沒(méi)有完全的接觸依賴,
2.有時(shí)觀察者不必接收所有被觀察者發(fā)送的消息,造成多余信息的傳遞
3.在循環(huán)對(duì)觀察者通知時(shí),可能觀察的的阻塞或者消息執(zhí)行不通,影響程序的執(zhí)行效率