幾個同事上班期間看股市行情,讓前臺MM幫忙看着老闆何時過來查崗,老闆進門的時候MM就撥電話給其中一個同事,因而全部同事都知道了,再繼續工做。。。編程
/** * 前臺祕書MM * Created by callmeDevil on 2019/7/27. */ public class Secretary { // 同事列表 private List<StockObserver> observers = new ArrayList<>(); private String action; // 增長 public void attach(StockObserver observer){ // 有幾個同事請前臺幫忙,因而就給集合增長几個對象 observers.add(observer); } // 通知 public void call(){ // 待老闆來了,就給全部登記的同事們發通知 for (StockObserver observer : observers) { observer.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
/** * 看股票同事 * Created by callmeDevil on 2019/7/27. */ public class StockObserver { private String name; private Secretary sub; public StockObserver(String name, Secretary sub){ this.name = name; this.sub = sub; } public void update(){ System.out.println(String.format("%s %s 關閉股票行情,繼續工做!", sub.getAction(), name)); } }
public class Test { public static void main(String[] args) { // 前臺妹子 Secretary mm = new Secretary(); // 看股票的同事 StockObserver observer1 = new StockObserver("哪路託", mm); StockObserver observer2 = new StockObserver("啥是gay", mm); // 前臺妹子記下兩位同事 mm.attach(observer1); mm.attach(observer2); // 發現老闆 mm.setAction("老闆回來了!"); // 通知兩個同事 mm.call(); } }
老闆回來了! 哪路託 關閉股票行情,繼續工做! 老闆回來了! 啥是gay 關閉股票行情,繼續工做!
/** * 抽象觀察者 * Created by callmeDevil on 2019/7/27. */ public abstract class Observer { protected String name; protected Secretary sub; public Observer(String name, Secretary sub) { this.name = name; this.sub = sub; } public abstract void update(); }
/** * 前臺祕書MM * Created by callmeDevil on 2019/7/27. */ public class Secretary { // 同事列表 private List<Observer> observers = new ArrayList<>(); private String action; // 增長 public void attach(Observer observer) { //針對抽象編程,減小了與具體類的耦合 observers.add(observer); } // 減小 public void detach(Observer observer) { //針對抽象編程,減小了與具體類的耦合 observers.remove(observer); } // 通知 public void call() { for (Observer observer : observers) { observer.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
/** * 看股票的同事 * Created by callmeDevil on 2019/7/27. */ public class StockObserver extends Observer { public StockObserver(String name, Secretary sub) { super(name, sub); } @Override public void update(){ System.out.println(String.format("%s %s 關閉股票行情,繼續工做!", sub.getAction(), name)); } }
/** * 看 NBA 的同事 * Created by callmeDevil on 2019/7/27. */ public class NBAObserver extends Observer { public NBAObserver(String name, Secretary sub) { super(name, sub); } @Override public void update() { System.out.println(String.format("%s %s 關閉NBA 直播,繼續工做!", sub.getAction(), name)); } }
測試代碼同上ide
其實「前臺MM」也應該抽象出來,若是老闆回來時,MM來不及電話了,因而通知你們的任務變成誰來作?是的,這時候是老闆本人變成了通知者。工具
又叫作發佈-訂閱模式。定義了一種一對多的依賴關係,讓多個觀察者對象同事監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知全部觀察者對象,使它們可以自動更新本身。測試
/** * 通知者接口 * Created by callmeDevil on 2019/7/27. */ public interface Subject { void attach(Observer observer); void detach(Observer observer); void call(); String getAction(); void setAction(String action); }
/** * 老闆 * Created by callmeDevil on 2019/7/27. */ public class Boss implements Subject { // 同事列表 private List<Observer> observers = new ArrayList<>(); private String action; @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void call() { for (Observer observer : observers) { observer.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
/** * 抽象觀察者 * Created by callmeDevil on 2019/7/27. */ public abstract class Observer { protected String name; protected Subject sub; public Observer(String name, Subject sub) { // 原來是「前臺MM」,現改爲「抽象通知者」 this.name = name; this.sub = sub; } public abstract void update(); }
/** * 看股票的同事 * Created by callmeDevil on 2019/7/27. */ public class StockObserver extends Observer { public StockObserver(String name, Subject sub) { // 原來是「前臺MM」,現改爲「抽象通知者」 super(name, sub); } @Override public void update(){ System.out.println(String.format("%s %s 關閉股票行情,繼續工做!", sub.getAction(), name)); } }
public class Test { public static void main(String[] args) { // 老闆 Boss boss = new Boss(); // 看股票的同事 StockObserver observer1 = new StockObserver("哪路託", boss); // 看NBA的同事 NBAObserver observer2 = new NBAObserver("啥事gay", boss); boss.attach(observer1); boss.attach(observer2); boss.detach(observer1); // 主角光環!斑怎麼樣都打不過哪路託!因此減去 // 斑復活了! boss.setAction("我宇智波斑復活了!"); // 發出通知 boss.call(); } }
我宇智波斑復活了! 啥事gay 關閉NBA 直播,繼續工做!