經常向遇到有的面試官讓你手撕觀察者
模擬觀察者模式的3個要點:
1.需要兩個接口,觀察者,和被觀察者。
2.被觀察者接口需要有兩個方法, 一個是注冊觀察者方法,一個是通知觀察者方法。
3.被觀察者需要有一個集合,用於儲存觀察者,注冊方法就是向集合里添加對象。通知方法就是遍歷集合。
package com.DesignMode.Observer; /** * 〈一句話功能簡述〉; * 〈觀察者抽象接口〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public interface Observer { public void update(int tmp); }
package com.DesignMode.Observer; /** * 〈一句話功能簡述〉; * 〈被觀察者接口〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public interface Subject { //注冊觀察者 public void regist(Observer o); //移除觀察者 public void remove(Observer o); //通知觀察者 public void notifyObserver(); }
package com.DesignMode.Observer; import java.util.ArrayList; /** * 〈一句話功能簡述〉; * 〈被觀察者具體實現〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class Wheather implements Subject { private ArrayList<Observer> list = new ArrayList<>(); private int tmp = 2; @Override public void regist(Observer o) { list.add(o); } @Override public void remove(Observer o) { list.remove(o); } @Override public void notifyObserver() { if(list != null && list.size() > 0) { for(int i=0;i<list.size();i++) { //遍歷通知所有觀察者 list.get(i).update(tmp); } } } public void setTmp(int tmp) { this.tmp = tmp; notifyObserver(); } }
package com.DesignMode.Observer; /** * 〈一句話功能簡述〉; * 〈觀察者1〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class Observer1 implements Observer { @Override public void update(int tmp) { System.out.println("Observer1:" + tmp); } }
package com.DesignMode.Observer; /** * 〈一句話功能簡述〉; * 〈觀察者2〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class Observer2 implements Observer { @Override public void update(int tmp) { System.out.println("Observer2:" + tmp); } }
測試代碼:
package com.DesignMode.Observer; /** * 〈一句話功能簡述〉; * 〈功能詳細描述〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class TestObserver { public static void main(String[] args){ Wheather w = new Wheather(); Observer1 o1 = new Observer1(); Observer2 o2 = new Observer2(); w.regist(o1); w.regist(o2); w.setTmp(10); } }
測試結果:
Observer1:10
Observer2:10