1. 观察者模式

1.1 关于

定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。

1.2 程序样例

定义事件接口:

public interface Event {

    List<Listener> listeners = Lists.newCopyOnWriteArrayList();

    default void addListener(Listener listener) {
        listeners.add(listener);
    }

    default void removeListener(Listener listener) {
        listeners.remove(listener);
    }

    default void publish() {
        for (Listener listener : listeners) {
            listener.onEvent(this);
        }
    }
}

定义监听器接口:

public interface Listener<E extends Event> {
    void onEvent(E event);
}

定义具体事件,磁盘使用情况事件:

@Data
public class DiskUsageEvent implements Event {
    private String message;
}

定义具体监听器,磁盘使用情况到达一定比例发送邮件:

@Slf4j
public class MailListener implements Listener<DiskUsageEvent> {

    @Override
    public void onEvent(DiskUsageEvent event) {
        System.out.println("邮件监听收到消息,准备发送邮件:" + event.getMessage());
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        // 实例化事件
        DiskUsageEvent event = new DiskUsageEvent();
        event.setMessage("磁盘使用情况达到预警");
        // 实例化监听器
        MailListener mailListener = new MailListener();
        BackupListener backupListener = new BackupListener();
        // 事件添加监听
        event.addListener(mailListener);
        event.addListener(backupListener);
        // 发布事件
        event.publish();
    }
}