觀察者模式
定義:觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀态上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
1.觀察者模式的結構
(1)抽象主題角色(Subject)
把所有對觀察者對象的引用儲存在一個集合中,每個抽象主題角色都可以有任意數量的觀察者。抽象主題提供一個接口,可以增加和删除觀察者角色。一般用一個抽象類和接口來實作。
(2)抽象觀察者角色(Observer)
為所有具體的觀察者定義一個抽象類或接口,在得到主題的通知時更新自己。
(3)具體主題角色(ConcreteSubject)
在具體主題内部狀态改變時,給所有登記過的觀察者發出通知。具體主題角色通常用一個子類實作。
(4)具體觀察者角色(ConcreteObserver)
該角色實作抽象觀察者角色所要求的更新接口,以便使本身的狀态與主題的狀态相協調。通常用一個子類實作。如果需要,具體觀察者角色可以儲存一個指向具體主題角色的引用。
2.代碼實作
(1)抽象主題接口————Subject.java
public interface Subject {
void registerobserver(Observer o);
void unregisterobserver(Observer o);
void notifyobservers();
}
(2)抽象觀察者接口————Observer.java
public interface Observer {
public void update(String msg);
}
(3)具體主題————Financial.java
import java.util.ArrayList;
/**
* Created by Zephery on 2017/5/7.
*/
public class Financial implements Subject {
private ArrayList<Observer> userList = new ArrayList<Observer>();
private String msg;
@Override
public void registerobserver(Observer o) {
if (!userList.contains(o)) {
userList.add(o);
}
}
@Override
public void unregisterobserver(Observer o) {
if (userList.contains(o)) {
userList.remove(o);
}
}
@Override
public void notifyobservers() {
for (Observer observer : userList) {
observer.update(msg);
}
}
public void distributemsg(String s) {
this.msg = s;
notifyobservers();
}
}
(4)具體觀察者————user1.java和user2.java
User1
public class User1 implements Observer {
private Subject subject;
public User1(Subject subject){
this.subject=subject;
subject.registerobserver(this);
}
@Override
public void update(String msg){
System.out.println("User1 "+msg+" message");
}
}
User2
public class User2 implements Observer {
private Subject subject;
public User2(Subject subject) {
this.subject = subject;
subject.registerobserver(this);
}
@Override
public void update(String msg) {
System.out.println("User2 " + msg + " message");
}
}
(5)用戶端測試類————ObserverPattern.java
public class ObserverPattern {
public static void main(String args[]){
Financial x=new Financial();
User1 y=new User1(x);
User2 z=new User2(x);
x.distributemsg("using");
}
}
結果:
User1 using message
User2 using message
如果,您認為閱讀這篇部落格讓您有些收獲,不妨拿出手機【微信掃一掃】

您的資助是我最大的動力!
金額随意,歡迎來賞!