天天看點

觀察者模式——java設計模式

觀察者模式

定義:觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀态上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

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
           

如果,您認為閱讀這篇部落格讓您有些收獲,不妨拿出手機【微信掃一掃】

觀察者模式——java設計模式

您的資助是我最大的動力!

金額随意,歡迎來賞!

繼續閱讀