【設計模式輕鬆學】----- 觀察者模式

什麼是觀察者模式

  觀察者模式:定義對象之間的一對多依賴,當一個對象的改變狀態時,它的依賴者都會收到通知並自動更新。這裏就用報社、人來分析,若是有人想看報紙就能夠向報社訂閱,若是已經訂閱的人不想看報紙能夠向報社註銷,而對於報社而言,它只會把報紙發給訂閱的人羣,這裏的報社就是觀察者模式中的主題(Subject),人就是觀察者(Observer),觀察者向主題註冊本身就能夠在主題改變時收到通知。java

UML圖

代碼實現

/**
 * 觀察者模式的主題,用於註冊、移除、通知觀察者
 */
public interface Subject {
    /**
     * 新增觀察者
     */
    void registerObserver(Observer observer);

    /**
     * 移除觀察者
     */
    void removeObserver(Observer observer);

    /**
     * 通知觀察者
     */
    void notifyObserver(String newspaperName);
}

/**
 * 觀察者接口類
 */
public interface Observer {

    /**
     * 被通知時作的操做
     */
    void update(String newspaperName);

}

  上面時觀察者模式的兩個核心類,下面時具體的應用,首先是主題實現類-NewspaperOffice,observerList 保存全部的觀察者,編程

import java.util.ArrayList;
import java.util.List;

public class NewspaperOffice  implements Subject{

    private List<Observer> observerList = new ArrayList<>();

    @Override
    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    /**
     * 通知觀察者們
     */
    @Override
    public void notifyObserver(String newspaperName) {
        observerList.forEach((b) -> b.update(newspaperName));
    }

}

  這裏是具體的觀察者,也就是被通知的對象數組

/**
 * 觀察者A
 */
public class CustomerA implements Observer{

    private Subject subject;

    public CustomerA(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    @Override
    public void update(String newspaperName) {
        System.out.println("CustomerA:《" + newspaperName + "》發佈了");
    }

}


/**
 * 觀察者B
 */
public class CustomerB implements Observer {

    private Subject subject;

    public CustomerB(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    @Override
    public void update(String newspaperName) {
        System.out.println("CustomerB:《" + newspaperName + "》發佈了");
    }

}

  測試上面寫的簡易觀察者模式實現ide

public class ObserverTest {
    public static void main(String[] args) {
        Subject subject = new NewspaperOffice();
        new CustomerA(subject);
        // 註冊觀察者B
        new CustomerB(subject);
        // 通知觀察者們
        subject.notifyObserver("日報A");
        System.out.println("========================================");
        subject.notifyObserver("日報B");
    }
}

  測試結果
測試

總結

  從上面的例子分析,主題和觀察則都是接口,主題經過接口通知依賴它的全部觀察者作某個操做(廣播通訊),只要知道具體對象的列表,而不須要知道某個具體的對象,上面例子NewspaperOffice只需擁有Observer數組,至於具體的某個Observer並不關注,下降了對象之間的耦合度,這裏也是設計原則"針對接口編程,不針對實現編程"的體現。this

相關文章
相關標籤/搜索