Java设计模式笔记(6)观察者模式
觀察者模式,也叫發(fā)布訂閱模式,定義對象之間的一種一對多的依賴關系,使得每當一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新。
觀察者模式的幾個角色:
Subject被觀察者:定義被觀察者必須實現(xiàn)的職責,它必須能夠動態(tài)地增加、取消觀察者。它一般是抽象類或者是實現(xiàn)類,僅僅是完成作為被觀察者必須實現(xiàn)的職責。
Observer觀察者:觀察者收到消息后,即進行update(更新方法)操作,對接收到的信息進行處理。
ConcreteSubject具體的被觀察者:定義被觀察者自己的業(yè)務邏輯,同時定義哪些事件進行通知。
ConcreteObserver具體的觀察者:每個觀察者在接受到消息后的處理反應是不同,各個觀察者有自己的處理邏輯。
1. 代碼
// 被觀察者 public abstract class Subject {// 定一個一個觀察者數(shù)組 ArrayList是線程異步,不安全,Vector是線程同步,安全private Vector<Observer> obsVector = new Vector<Observer>();// 增加一個觀察者public void addObserver(Observer o) {this.obsVector.add(o);}// 刪除一個觀察者public void delObserver(Observer o) {this.obsVector.remove(o);}// 通知所有觀察者public void notifyObserver() {for (Observer o : this.obsVector) {o.update();}} }// 具體的被觀察者 public class ConcreteSubject extends Subject {// 具體的業(yè)務public void doSomething() {/** do something*/super.notifyObserver();} }// 觀察者 public interface Observer {// 更新方法public void update(); }// 具體觀察者 public class ConcreteObserver implements Observer {// 實現(xiàn)更新方法public void update() {System.out.println("接收到信息,并進行處理!");}}// 場景類 public class Client {public static void main(String[] args) {// 創(chuàng)建一個被觀察者ConcreteSubject subject = new ConcreteSubject();// 定義一個觀察則Observer obs = new ConcreteObserver();// 觀察者觀察被被觀察則subject.addObserver(obs);// 觀察者開始活動了subject.doSomething();}}2.?使用java.util包中的標準類實現(xiàn)觀察者模式
JDK提供了對觀察者模式的支持接口和實現(xiàn)類。
其中接口 java.util.Observer 用來指定觀察者,觀察者必須實現(xiàn) void update(Observable o, Object arg) 方法,參數(shù) Observable o 用于指定觸發(fā) update 方法的對象, Object arg 用于指定觸發(fā) update 方法時候的附加參數(shù)。而 java.util.Observable 用來指定觀察物(被觀察者、可被觀察的),并且提供了一系列的方法。
import java.util.Observable; import java.util.Observer;/*** 使用java.util包中的標準類實現(xiàn)觀察者模式*/ public class ObserverClient {public static void main(String[] args) {ObserverClient client = new ObserverClient();// 被觀察者ConcreteSubject1 subject1 = client.new ConcreteSubject1(1);ConcreteSubject2 subject2 = client.new ConcreteSubject2("userek");// 觀察者Observer observer1 = client.new ConcreteObserver1();Observer observer2 = client.new ConcreteObserver2();// 注冊subject1.addObserver(observer1);subject1.addObserver(observer2);subject2.addObserver(observer1);// 改變被觀察者狀態(tài),觸發(fā)觀察者回調(diào)函數(shù)subject1.doSomething();subject2.doSomething();}class ConcreteSubject1 extends Observable {private int mSubjectValue;private ConcreteSubject1(int mSubjectValue) {super();this.mSubjectValue = mSubjectValue;}public void doSomething() {setChanged();notifyObservers(mSubjectValue);}@Overridepublic String toString() {return getClass().getSimpleName();}}class ConcreteSubject2 extends Observable {private String mSubjectName;private ConcreteSubject2(String mSubjectName) {super();this.mSubjectName = mSubjectName;}public void doSomething() {setChanged();notifyObservers(mSubjectName);}@Overridepublic String toString() {return getClass().getSimpleName();}}class ConcreteObserver1 implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("第一個 Observer!" + " 被觀察者 : " + o + ", 觀察的值為" + (arg instanceof Integer ? "整型" : "字符串") + ": " + arg);}}class ConcreteObserver2 implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("第二個 Observer!");}}}總結(jié)
以上是生活随笔為你收集整理的Java设计模式笔记(6)观察者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 厌倦了Windows 买不起Mac电脑?
- 下一篇: java gc回收算法_Java GC回