设计模式

设计模式20:观察者模式(Observer)

2019-04-23  本文已影响0人  ygxing

1. 简介

- 观察者模式,又被成为发布订阅模式,
- 当一个对象的状态发生改变之后,会主动通知所有观察者,
- 然后每个观察者执行自己相应的函数
1.1 优点
- 被观察的对象和观察者之间解耦,方便扩展
- 观察者之间相互解耦,只是实现了共同接口
1.2 缺点
- 在单线程环境中,观察者收到通知的时间会比较长
1.3 使用场景
- 事件驱动模式:
    按钮点击,页面刷新等等
- 广播模式:
    系统启动时,通知各个组件

2.实现代码

这里使用了观察者模式的一个扩展模式,
也就是事件监听器模式来实现
2.1 具体逻辑
领导和老板都希望员工能好好工作,
就找人监听员工yanggx的工作状态,
当yanggx工作状态改变的时候,
监听者就会将事件汇报领导和老板,
这里就涉及到四个组成部分:事件源,事件,监听器和事件发布器
2.1.1事件源
yanggx这个人,对应的类是Yanggx
/**
 * 事件源,也就是被监听的对象,
 * 这里是yanggx这个人
 */
public class Yanggx {
    private String state;
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
}
2.1.2事件
- yanggx所发生的事件,对应抽象类YanggxEvent
- 我们主要监听工作事件,所以只有一个实现类YanggxWorkEvent
/**
 * yanggx事件
 */
public abstract class YanggxEvent extends EventObject {
    private static final long serialVersionUID = -1336288592330402915L;
    public YanggxEvent(Object source) {
        super(source);
    }
}
/**
 * 工作事件
 */
public class YanggxWorkEvent extends YanggxEvent {

    private static final long serialVersionUID = -4366933029591990461L;

    public YanggxWorkEvent(Yanggx yanggx) {
        super(yanggx);
    }
}
2.1.3 监听器
- 就是对yanggx工作感兴趣的人,对应接口YanggxListener
- 对yanggx工作感兴趣的有大Boss,对应实现类YanggxBossListener,
- 还有上级领导也感兴趣,对应实现类YanggxLeaderListener
/**
 * yanggx事件的监听器
 */
public interface YanggxListener<E extends YanggxEvent> extends EventListener {
    /**
     * 监听到事件之后,触发的动作
     * @param event
     */
    void onYanggxEvent(E event);
}

/**
 * yanggx的老板监听器
 */
public class YanggxBossListener implements YanggxListener<YanggxEvent> {

    @Override
    public void onYanggxEvent(YanggxEvent event) {
        Yanggx yanggx = (Yanggx) event.getSource();
        System.out.println("Boss:我不认识他,所以不做任何处理");
    }
}

/**
 * yanggx的领导监听器
 */
public class YanggxLeaderListener implements YanggxListener<YanggxEvent> {

    @Override
    public void onYanggxEvent(YanggxEvent event) {
        Yanggx yanggx = (Yanggx) event.getSource();
        System.out.print("Leader:上班时间" + yanggx.getState() + "赶紧起来干活");
    }
}
2.1.4事件发布器
就是将工作事件汇报给上级领导的人,对应的类是YanggxEventPublisher
/**
 * 事件发布器
 */
public class YanggxEventPublisher {

    List<YanggxListener<YanggxEvent>> listeners = new ArrayList<>();

    /**
     * 注册监听器
     * 
     * @param listener
     */
    public void registListener(YanggxListener<YanggxEvent> listener) {
        listeners.add(listener);
    }

    /**
     * 发布事件
     * 
     * @param event
     */
    public void publishEvent(YanggxEvent event) {
        System.out.println("发布Yanggx事件开始...");
        for (YanggxListener<YanggxEvent> listener : listeners) {
            listener.onYanggxEvent(event);
        }
    }
}
2.2 类图
观察者模式
2.3 代码测试
//测试类
public class ObserverTest {
    public static void main(String[] args) {
        // 事件源:yanggx
        Yanggx yanggx = new Yanggx();
        yanggx.setState("睡觉...");
        // 事件
        YanggxEvent event = new YanggxWorkEvent(yanggx);
        // 在事件发布者中注册监听器
        YanggxEventPublisher publisher = new YanggxEventPublisher();
        publisher.registListener(new YanggxBossListener());
        publisher.registListener(new YanggxLeaderListener());
        // 发布事件
        publisher.publishEvent(event);
    }
}

运行结果:
    发布Yanggx事件开始...
    Boss:我不认识他,所以不做任何处理
    Leader:上班时间睡觉...赶紧起来干活
上一篇下一篇

猜你喜欢

热点阅读