观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。
对于观察者模式而言,肯定有观察者和被观察者之分。比如在一个目录下建立一个文件,这时系统会通知目录管理器增加目录,并通知磁盘减少空间,在这里,文件就是观察者,目录管理器和磁盘就是被观察者。
观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
下面这些其实都是观察者模式:
- Observer
 - Listener
 - Hook
 - Callback
 
例子1:
事件源接口:
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);
}
Dad:
class Dad implements Observer {
    public void feed() {
        System.out.println("dad feeding...");
    }
    @Override
    public void actionOnWakeUp(wakeUpEvent event) {
        feed();
    }
}
Mum:
class Mum implements Observer {
    public void hug() {
        System.out.println("mum hugging...");
    }
    @Override
    public void actionOnWakeUp(wakeUpEvent event) {
        hug();
    }
}
Dog:
class Dog implements Observer {
    public void wang() {
        System.out.println("dog wang...");
    }
    @Override
    public void actionOnWakeUp(wakeUpEvent event) {
        wang();
    }
}
被观察者:
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");
        });
        //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);
        }
    }
}
客户端:
public class Main {
    public static void main(String[] args) {
        Child c = new Child();
        //do sth
        c.wakeUp();
    }
}
运行截图:
例子2:
事件源:
class ActionEvent {
    long when;
    Object source;
    public ActionEvent(long when, Object source) {
        super();
        this.when = when;
        this.source = source;
    }
    public long getWhen() {
        return when;
    }
    public Object getSource() {
        return source;
    }
}
观察者接口:
interface ActionListener {
    public void actionPerformed(ActionEvent e);
}
MyActionListenerA:
class MyActionListenerA implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("button pressed!");
    }  
}
MyActionListenerB:
class MyActionListenerB implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("button pressed 2!");
    }
}
被观察者:
class Button {
    private List<ActionListener> actionListeners = new ArrayList<ActionListener>();
    public void buttonPressed() {
        ActionEvent e = new ActionEvent(System.currentTimeMillis(),this);
        for(int i = 0; i < actionListeners.size(); i++) {
            ActionListener l = actionListeners.get(i);
            l.actionPerformed(e);
        }
    }
    public void addActionListener(ActionListener l) {
        actionListeners.add(l);
    }
}
客户端:
public class Test {
    public static void main(String[] args) {
        Button b = new Button();
        b.addActionListener(new MyActionListenerA());
        b.addActionListener(new MyActionListenerB());
        b.buttonPressed();
    }
}
运行截图:

京公网安备 11010502036488号