设计模式------观察者模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式------观察者模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、觀察者模式1、觀察者模式 Observer觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己。2、觀察者模式使用情況(1) 當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以
各自獨立地改變和復用。(2) 當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。(3) 當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。3、觀察者模式的組成抽象主題角色:把所有對觀察者對象的引用保存在一個集合中,每個抽象主題角色都可以有任意數量的觀察者。
抽象主題提供一個接口,可以增加和刪除觀察者角色。一般用一個抽象類和接口來實現。抽象觀察者角色:為所有具體的觀察者定義一個接口,在得到主題的通知時更新自己。具體主題角色:在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色通常用一個子類
實現。具體觀察者角色:該角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。
通常用一個子類實現。如果需要,具體觀察者角色可以保存一個指向具體主題角色的引用。
二、使用范例在這里模擬了美團網的功能,你當去美團網上注冊一個賬號時,每當有新的團購時,就會發郵件到你郵箱。
在這里,我改了下,每當有新的食物時,就發送給用戶
package com.pattern.observer;/*** 抽象目標類* @author Leon.Sun**/
public interface Subject {/*** 注冊觀察都者* @param obj*/public void RegisterObserver(Observer obj);/*** 刪除觀察者* @param obj*/public void RemoveObserver(Observer obj);/*** 通知所有觀察者* @param food*/public void NotifyAllObservers(String food);}
package com.pattern.observer;/*** 抽象觀察者類* @author Leon.Sun**/
public interface Observer {public void update(String food);}
package com.pattern.observer;import java.util.ArrayList;public class RealSubject implements Subject {/*** 用來存放觀察者*/private ArrayList<Observer> userList=new ArrayList<Observer>();/*** 用來存放有什么食物*/private ArrayList<String> food=new ArrayList<String>();@Overridepublic void RegisterObserver(Observer obj) {userList.add(obj);}@Overridepublic void RemoveObserver(Observer obj) {userList.remove(obj);}@Overridepublic void NotifyAllObservers(String food) {for(Observer obj: userList){obj.update(food);}}}
package com.pattern.observer;public class RealObserver implements Observer{/*** 用來保存人名*/private String name;public RealObserver(String name) {this.name = name;}@Overridepublic void update(String food) {System.out.println("通知"+name+"美團網今天有"+food+"可以吃");}}
package com.pattern.observer;public class ObserverMethod {public static void main(String[] args) {// 這里是美團網Subject meiTuWang=new RealSubject();// 生成三個觀察者Observer obj1=new RealObserver("小紅");Observer obj2=new RealObserver("德德");Observer obj3=new RealObserver("阿炳");// 注冊三個觀察者meiTuWang.RegisterObserver(obj1);meiTuWang.RegisterObserver(obj2);meiTuWang.RegisterObserver(obj3);// 通知三個觀察者,有新的食物可以吃meiTuWang.NotifyAllObservers("蘋果");meiTuWang.NotifyAllObservers("豬肉");meiTuWang.NotifyAllObservers("大米飯");}
}
通知小紅美團網今天有蘋果可以吃
通知德德美團網今天有蘋果可以吃
通知阿炳美團網今天有蘋果可以吃
通知小紅美團網今天有豬肉可以吃
通知德德美團網今天有豬肉可以吃
通知阿炳美團網今天有豬肉可以吃
通知小紅美團網今天有大米飯可以吃
通知德德美團網今天有大米飯可以吃
通知阿炳美團網今天有大米飯可以吃
?
總結
以上是生活随笔為你收集整理的设计模式------观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式------代理模式
- 下一篇: triggered_time