观察者模式与事件监听器模式--java设计模式扫盲

最近在开发监控系统,涉及事件监听,所以又把之前的观察者设计模式和事件监听器模式拿了出来重新学习一下,总结内容如下:

观察者模式

1.名词解释

观察者对象:观察者对象是监听被观察者的一个对象,当被观察者状态发生变化的时候,会通知观察者对象,使观察者对象可以自己更新自己,多个观察者对象可以监听同一个被观察者

被观察者对象:也叫主题对象,主要是在自身状态发生变化的时候,会通知所有监听它的观察者

2.解决的问题

这种模式通常被用来做事件处理系统。观察者模式又被称为订阅-发布模式,被观察者也就是主题对象管理所有相依于它的观察者对象,并且在它自身状态变化的时候主动发出通知通知观察者,然后观察者会更新自己。一些基于事件驱动机制的技术或者语言,比如java NIO或者node.js,其基础模式都是观察者模式。

3.实现

观察者类

import java.util.Observable;
import java.util.Observer;

public class Watcher implements Observer {

    @Override
    public void update(Observable o, Object arg) {

        System.out.println("update() is called!");

    }

}
被观察者类

import java.util.Observable;

public class BeingWatcher extends Observable {

    void counter(int num) {

        for (; num >= 0; num--) {
            setChanged();
            notifyObservers(new Integer(num));
            try {
                Thread.sleep(100);
            }
            catch (InterruptedException e) {
                System.out.println("Sleep interrupeted");
            }
        }
    }
}
测试一下

public class ObserverModeDemo {

    public static void main(String[] args) {

        BeingWatcher beingWatcher = new BeingWatcher();
        Watcher watcher = new Watcher();
        beingWatcher.addObserver(watcher);
        beingWatcher.counter(5);
    }

}
测试结果


监听器模式

所谓监听器模式,指的是事件源经过事件的封装传给监听器,当事件源触发事件之后,监听器收到事件的通知并执行事件回调方法。

监听器模式实现四个步骤:

1.定义事件源(具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener)

import java.util.Enumeration;
import java.util.Vector;

public class Source {

    private Vector repository = new Vector<>();

    public Source() {

    }

    public void addListener(Listener listener) {

        repository.addElement(listener);
    }

    public void notifyEvent() {

        Enumeration enumer = repository.elements();
        while (enumer.hasMoreElements()) {
            Listener listener = (Listener) enumer.nextElement();
            listener.handleEvent(new Event(this));
        }
    }
}
2.定义事件对象
import java.util.EventObject;

public class Event extends EventObject {

    public Event(Object source) {
        super(source);
        // TODO Auto-generated constructor stub
    }

    public void say() {

        System.out.println("say method");
    }
}
3.定义事件监听器接口

import java.util.EventListener;

public interface Listener extends EventListener {

    public void handleEvent(Event ev);
}
4.定义监听器实现类

public class EventListener implements Listener {

    @Override
    public void handleEvent(Event ev) {

        System.out.println("listener start!");
        ev.say();
    }

}
测试一下

public class DemoTest {

    Source source;

    public DemoTest() {
        try {
            source = new Source();
            EventListener listener = new EventListener();
            source.addListener(listener);
            source.addListener(new Listener() {

                @Override
                public void handleEvent(Event event) {

                    System.out.println("Method come from 匿名类...");
                }
            });
            source.notifyEvent();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {

        new DemoTest();
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值