观察者模式
观察者例子
一个气象台 想要几个显示器 , 数据从weather对象中获取 如果 weather 数据更新 显示器要更新对应数据
显示器就是观察者 而气象台的数据weather 就是通知者(主题对象)
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
public class Obs implements Observer, DisPlay { float temp; float humidity; float pressur; private Subject weather;
public Obs(Subject sub) { this.weather = sub; sub.RegistObserver(this); }
@Override public void update(float temp, float humidity, float pressure) { this.temp = temp; this.humidity = humidity; this.pressur = pressure; display(); }
@Override public void display() { System.out.println(temp + "==" + humidity + "==" + pressur); } }
interface Observer { void update(float temp, float humidity, float pressure); }
interface DisPlay { void display(); }
class MainDemo { public static void main(String[] args) { Weather weather = new Weather(); Obs obs1 = new Obs(weather); Obs obs2 = new Obs(weather); Obs obs3 = new Obs(weather); weather.setMessage(12, 12, 12); weather.RemoveObserver(obs2); weather.setMessage(13, 13, 13);
} }
|
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
public class Weather implements Subject { private List<Observer> observers; private float temp; private float humidity; private float pressur;
public Weather() { this.observers = new ArrayList<>(); }
@Override public void RegistObserver(Observer o) { observers.add(o); }
@Override public void RemoveObserver(Observer o) { int i = observers.indexOf(o); observers.remove(i); }
@Override public void notifyObserver() { for (Observer observer : observers) { observer.update(temp, humidity, pressur); } }
public void setMessage(float temp, float humidity, float pressure) { this.temp = temp; this.humidity = humidity; this.pressur = pressure; notifyObserver(); } }
interface Subject { void RegistObserver(Observer o); void RemoveObserver(Observer o); void notifyObserver(); }
|

image.png
观察者模式
定义了一种一对多的依赖关系, 让多个观察者对象同时监听某个主题对象. 这个主体对象发生变化时会通知所有的观察者, 使得他们自己可以更新自己

image.png
观察者监听
观察者list
被观察者event
初始化和成就事件触发检测需要被移除的观察者
1
| 事件监听list(在初始化时监听) -- 当事件触(发送时间event.fire) -- obs类根据条件遍历发送消息到对应的对象 -- 对象接收时间判断.... 是否取消监听...
|
java中lambda实现委托
委托
委托是一种引用方法类型, 一旦为委托分配了方法,委托与该方法有完全相同的行为. 委托方法使用和其他方法一样.委托可以看做对函数的抽象, 是函数的”类”, 委托的实例代表的一个具体的函数,
委托能搭载的方法必须有相同的参数列表和返回值 和java8中方法引用的实现方式相同
代码实现:
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class MyDelegate { private MyAction<Integer> delegate;
public static void main(String[] args) { MyDelegate delegate = new MyDelegate(); delegate.delegate = (Integer i) -> { System.out.println(i); }; delegate.delegate.action(3); delegate.delegate = MyDelegate::action; delegate.delegate.action(3); }
private static void action(Integer i) { System.out.println("::" + "--" + i); } }
interface MyAction<T> { void action(T t); }
|