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