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