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

  觀察者模式:又稱發佈-訂閱(Publish/Subscribe)模式。咱們先看一個例子,如今直播行業越作越大,許多人都有關注本身喜歡的主播,人們訂閱某一個主播,當該主播開播時,給訂閱他的人發佈提示說他開始直播了,這就是一個觀察者模式的實例。網絡

  通知者類,提供了增長和刪除,以及通知觀察者對象的方法。ide

//網絡主播類
public class NetworkAnchor {
    //定義一個觀察者的集合
    List<People> observers = new ArrayList<>();

    //當有人訂閱了該主播,便把這個對象加入集合
    public void subscribe(People people){
        if(people!=null && !observers.contains(people)){
            observers.add(people);
        }
    }
    //取消訂閱
    public void cancel(People people){
        observers.remove(people);
    }
    //主播開播時通知觀察者
    public void notifyPeople(){
        for (People people: observers) {
            people.update(this);
        }
    }
}

  

  觀察者接口,在獲得通知者的通知時更新本身。測試

//網民類
public interface People {
    //定義一個更新方法,用於更新狀態
    void update(NetworkAnchor networkAnchor);
}

  

  具體的觀察者對象。this

//具體網民類A
public class PeopleA implements People {

    @Override
    public void update(NetworkAnchor networkAnchor) {
        System.out.println(this.getClass().getSimpleName()+ "收到" + networkAnchor.getClass().getSimpleName() + "的消息"); } }
//具體網民類B
public class PeopleB implements People {

    @Override
    public void update(NetworkAnchor networkAnchor) {
        System.out.println(this.getClass().getSimpleName()+ "收到" + networkAnchor.getClass().getSimpleName() + "的消息"); } }

  

  測試方法,首先建立一個主播類實例,將觀察者A,B添加進去,而後發佈通知。spa

//測試類
public class Test {
    public static void main(String[] args) {
        NetworkAnchor networkAnchor = new NetworkAnchor();
        networkAnchor.subscribe(new PeopleA());
        networkAnchor.subscribe(new PeopleB());
        networkAnchor.notifyPeople();
    }
}

測試結果:code

PeopleA收到NetworkAnchor的消息
PeopleB收到NetworkAnchor的消息server

 

  總結:當一個對象的改變須要改變其餘對象,而且被改變對象不知道其餘被改變對象時,咱們可使用觀察者模式。而且使用觀察者模式分離了觀察者與被觀察者,下降耦合程度,除此以外,當有其餘的網絡主播時,咱們能夠定義一個通知者的接口(這裏再也不實現),使全部通知者實現這個接口便可。讓耦合的雙方依賴抽象,符合依賴倒轉原則。對象

相關文章
相關標籤/搜索