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