观察者模式
理解:
1.被观察者类:内部持有观察者集合,当被观察者触发某个事件,根据具体事件调用所有的被观察者;
2.观察者类:根据被观察者触发的事件做出具体的动作;
3.事件类:根据被观察者定义具体的事件信息;
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| class Child { private boolean cry = false; private List<Observer> observers = new ArrayList<>();
{ observers.add(new Dad()); observers.add(new Mum()); observers.add(new Dog()); observers.add((e)->{ System.out.println("ppp"); }); }
public boolean isCry() { return cry; }
public void wakeUp() { cry = true;
wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);
for(Observer o : observers) { o.actionOnWakeUp(event); } } }
abstract class Event<T> { abstract T getSource(); }
class wakeUpEvent extends Event<Child>{ long timestamp; String loc; Child source;
public wakeUpEvent(long timestamp, String loc, Child source) { this.timestamp = timestamp; this.loc = loc; this.source = source; }
@Override Child getSource() { return source; } }
interface Observer { void actionOnWakeUp(wakeUpEvent event); }
class Dad implements Observer { public void feed() { System.out.println("dad feeding..."); }
@Override public void actionOnWakeUp(wakeUpEvent event) { feed(); } }
class Mum implements Observer { public void hug() { System.out.println("mum hugging..."); }
@Override public void actionOnWakeUp(wakeUpEvent event) { hug(); } }
class Dog implements Observer { public void wang() { System.out.println("dog wang..."); }
@Override public void actionOnWakeUp(wakeUpEvent event) { wang(); } }
public class Main { public static void main(String[] args) { Child c = new Child(); c.wakeUp(); } }
|
总结:观察者模式其实大量被应用,例如:回调函数(callback),钩子函数(hook),监听器等