观察者模式

拿一个listener举例,subject是被观察的对象,Observer是观察者
event是事件,EventLisenter是事件注册和监听。

事件类的代码如下:

public class Event {

    //事件源
    private Object source;
    //通知目标
    private Object target;
    //回调
    private Method callback;
    //触发
    private String trigger;

    private long time;

    public Event(Object target, Method callback) {
        this.target = target;
        this.callback = callback;
    }
 //此处省去set get方法
}

事件类型枚举

public enum SubjectEventType {
    ON_ADD,
    ON_RMOVE,
    ON_EDIT,
    ON_QUERY;
}

EventLisenter类

/**
 * 事件的注册和监听
 */
public class EventLisenter {

    //Map相当于是一个注册器,什么事件触发什么方法放入该容器内
    protected Map<Enum,Event> events = new HashMap<Enum,Event>();

    
    //参数说明:1.什么事情;2.观察者是谁;3.调用观察者的什么方法
    public void addLisenter(Enum eventType,Object target,Method callback){
        //注册事件
        //用反射调用这个方法
        events.put(eventType,new Event(target,callback));
    }
 
    private void trigger(Event e){
        e.setSource(this);
        e.setTime(System.currentTimeMillis());
        try {
            e.getCallback().invoke(e.getTarget(),e);
            
        } catch (Exception e1) {
            e1.printStackTrace();
        } 
    }


    protected void trigger(Enum call){
        if(!this.events.containsKey(call)){ return ;}
        trigger(this.events.get(call).setTrigger(call.toString()));
    }
}

被观察的类subject(继承时间监听类,并在自己的方法里,加入事件触发的方法):

public class Subject extends EventLisenter{

    //通常的话,采用动态里来实现监控,避免了代码侵入
    public void add(){
        System.out.println("调用添加的方法");
        trigger(SubjectEventType.ON_ADD);
    }

    public void remove(){
        System.out.println("调用删除的方法");
        trigger(SubjectEventType.ON_RMOVE);
    }

}

客户端测试类:

public class ObserverTest {

    public static void main(String[] args) {

        try{

            //观察者
            Observer observer = new Observer();
            Method advice = Observer.class.getMethod("advice", new Class<?>[]{Event.class});


            //创建被观察者
            Subject subject = new Subject();
            //添加事件
            subject.addLisenter(SubjectEventType.ON_ADD,observer,advice);
            subject.addLisenter(SubjectEventType.ON_EDIT,observer,advice);
            subject.addLisenter(SubjectEventType.ON_RMOVE,observer,advice);
            subject.addLisenter(SubjectEventType.ON_QUERY,observer,advice);
            //调用下面的方法,观察者会调用之前添加的事件
            subject.add();
            subject.remove();
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容