在對象之間定義了一對多的依賴,當一個對象改變狀態,依賴它的對象會收到通知並自動更新。java
public interface Observer { public void update(String message); }
包含了收到通知後執行的操做.面試
public interface Observerable { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObserver(); }
包含註冊,刪除,通知等功能.微信
public class User implements Observer{ private String name; private String message; public User(String name) { super(); this.name = name; } @Override public void update(String message) { this.message = message; read(); } public void read() { System.out.println(name+" 收到 " + message); } }
package observer3; import java.util.ArrayList; import java.util.List; public class WechatServer implements Observerable{ private List<Observer> list; private String message; public WechatServer() { list = new ArrayList<>(); } @Override public void registerObserver(Observer o) { list.add(o); } @Override public void removeObserver(Observer o) { if (!list.isEmpty()) { list.remove(o); } } @Override public void notifyObserver() { for (Observer o : list) { o.update(message); } } public void setInformation(String s) { this.message = s; System.out.println("通知者發送:"+s); notifyObserver(); } }
以微信的公衆號通知爲例子,裏面包含了list接口,能夠經過 setInformation 方法遍歷list來通知觀察者.ide
public class TestObserver { public static void main(String[] args) { WechatServer observerable = new WechatServer(); Observer ob1 = new User("ob1"); Observer ob2 = new User("ob2"); Observer ob3 = new User("ob3"); Observer ob4 = new User("ob4"); observerable.registerObserver(ob1); observerable.registerObserver(ob2); observerable.registerObserver(ob3); observerable.registerObserver(ob4); observerable.setInformation("hello world"); } }
被問到的兩個面試題: 測試
1.觀察者模式是什麼? this
存在觀察者和被觀察者兩個對象,二者是一對多的關係,當被觀察者發出通知的時候,觀察者能夠收到通知並執行相應的操做.spa
實現是經過定義 觀察者 和 被觀察者兩個接口, 被觀察者 能夠註冊和刪除 觀察者,在實現類裏面這個是經過list接口實現的, 經過遍歷list 集合來調用觀察者的方法來通知.code
2.何時應該通知觀察者?orm
在觀察者實現類中的屬性改變的時候或者根據具體需求定義的方法來調用notify方法通知.server
須要結合具體需求.