手写观察者模式
经常向遇到有的面试官让你手撕观察者
模拟观察者模式的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