設計模式之觀察者模式(Observer)
阿新 • • 發佈:2020-10-13
在看原始碼的時候我們經常會看到Observer、Listener、Hook、callback等單詞,不要被這些詞所迷惑,實際上說的都是觀察者模式,
觀察模式解決方案圖如下:
具體程式碼:
import java.util.ArrayList; import java.util.List; /** * 有很多時候,觀察者需要根據事件的具體情況來進行處理 * 大多數時候,我們處理事件的時候,需要事件源物件 * 事件也可以形成繼承體系 */ class Child { private boolean cry = false; private List<Observer> observers = newArrayList<>(); { observers.add(new Dad()); observers.add(new Mum()); observers.add(new Dog()); observers.add((e)->{ System.out.println("ppp"); }); //hook callback function } 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 extendsEvent<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(); //do sth c.wakeUp(); } }