觀察者模式
觀察者模式,又稱發(fā)布訂閱模式,有解耦、異步的特點(diǎn)
1. 定義
當(dāng)一個對象的狀態(tài)發(fā)生改變時,已經(jīng)登記的其他對象能夠觀察到這一改變從而做出自己相對應(yīng)的改變鹃栽,通過這種方式來達(dá)到減少依賴關(guān)系,解耦合的作用躯畴。
例子:微信朋友圈民鼓,以當(dāng)前個人作為訂閱者,好有作為主題蓬抄。一個人發(fā)了朋友圈丰嘉,好友看到朋友圈后,可以點(diǎn)贊或者評論嚷缭。
2. 主要角色
1. Subject(主題):主要由類實(shí)現(xiàn)的可觀察的接口供嚎,通知觀察者使用attach方法,以及取消觀察的detach方法
2. ConcreteSubject(具體主題):是實(shí)現(xiàn)一個主題接口的類峭状,處理觀察者的變化
3. Observe(觀察者):根據(jù)主題中的更改而進(jìn)行更新
3.代碼實(shí)現(xiàn)
3.1 主題定義
// 創(chuàng)建一個主題定義,定義添加刪除關(guān)系以及通知訂閱者
interface subject{
//添加訂閱關(guān)系
void attach(Observer observer);
// 移除訂閱關(guān)系
void detach(Observer observer);
// 通知訂閱者
void notifyObserves(String message);
}
3.2 主題的具體實(shí)現(xiàn)類
class ConcreteSubject implements subject{
//訂閱者容器
private List<Observer> observers = new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
//添加訂閱關(guān)系
observers.add(observer);
}
@Override
public void detach(Observer observer) {
//移除訂閱關(guān)系
observers.remove(observer);
}
@Override
public void notifyObserves(String message) {
// 訂閱通知
for (Observer observer : observers){
observer.update(message);
}
}
}
3.3 創(chuàng)建一個觀察者接口
//創(chuàng)建一個觀察者接口
interface Observer{
// 處理業(yè)務(wù)邏輯
void update(String message);
}
3.4 具體的觀察者類
//具體的觀察者類
class FriendOneObserver implements Observer{
@Override
public void update(String message) {
//模擬處理業(yè)務(wù)邏輯
System.out.println("用戶1看到了你發(fā)的動態(tài)"+message);
}
}
//具體的觀察者類
class FriendTwoObserver implements Observer{
@Override
public void update(String message) {
//模擬處理業(yè)務(wù)邏輯
System.out.println("用戶2看到了你發(fā)的動態(tài)"+message);
}
}
3.5 測試類
public class ObserverDesign {
public static void main(String[] args){
ConcreteSubject subject = new ConcreteSubject();
//添加觀察者
subject.attach(new FriendOneObserver());
FriendTwoObserver twoObserver = new FriendTwoObserver();
subject.attach(twoObserver);
System.out.println("");
//發(fā)送第一條朋友圈動態(tài) 所有人可見
subject.notifyObserves("第一條朋友圈動態(tài)");
//發(fā)送第二條朋友圈動態(tài) 僅用戶1可見
subject.detach(twoObserver);
subject.notifyObserves("第二條朋友圈動態(tài)");
}
}