10_1.事件委托

事件委托:把事情交给委托类去办,需要传递要委托的对象,要委托的方法还有及其参数(定义一个类封装好这些属性,并保存在数据结构中,下面就是很好的列子),最后通过反射调用获取实例,并调用其方法

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 事件委托机制
 * 关键:
 * 观察者模式(抽象通知者,具体通知者,抽象观察者,具体观察者)
 * 相比观察者模式,去掉了抽象观察者,每个具体观察者并将“更新”方法名改为各自适合的方法名
 * (每个观察者都有自己的方法,但参数类型一定要引用类型),主题或抽象通知者
 * 添加Object对象,MethodName方法名,args参数列表(添加具体观察者)
 * 具体主题或者具体通知者实现通知方法(循环调用每个具体观察者:通过反射)
 * @author zbl
 *
 */

public class NotifyCustomer {
    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Notifier notifier = new ConcreteNotifier();
        notifier.addListener(new Observer1(), "watch", "lala",true,14);
        notifier.addListener(new Observer2(), "see", "vvvv",12);
        notifier.mynotity();
    }
}

//抽象通知者
interface Notifier{
    public EventHanlder eventHanlder = new EventHanlder();//委托事件交给这个类去办
    public void addListener(Object object,String methodName,Object...args);//添加监听者
    public void mynotity() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException;
}

//具体通知者
class ConcreteNotifier implements Notifier{

    @Override
    public void addListener(Object object, String methodName, Object... args) {
        this.eventHanlder.add(object,methodName,args);
    }
    @Override
    public void mynotity() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        //观察者模式这里是循环抽象观察者,并调用update方法
        //此处用事件委托类,帮忙处理
        this.eventHanlder.mynotity();
    }

}

//事件处理器
class EventHanlder{

    private List<MyEvent> eventList = new ArrayList<MyEvent>();
    
    public void add(Object object, String methodName, Object[] args) {
        //把对象转换为我的事件
        MyEvent event = new MyEvent(object,methodName,args);
        eventList.add(event);
    }

    public void mynotity() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        for(MyEvent event : eventList){
            event.invoke();
        }
    }
}

//事件
class MyEvent{
    private Object object;
    private String methodName;
    private Object[] args;
    private Class[] paramTypes;
    public MyEvent(Object object, String methodName, Object[] args) {
        this.object = object;
        this.methodName = methodName;
        this.args = args;
        this.paramTypes = this.convertParamTypes(args);
    }
    
    //将参数的类型遍历出来放入Class类集合中,为反射做准备
    private Class[] convertParamTypes(Object[] args) {
        Class[] clazzes = new Class[args.length];
        for(int i=0;i<args.length;i++){
            clazzes[i] = args[i].getClass();
        }
        return clazzes;
    }
    
    public void invoke() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        //传入方法名,参数类型
        Method method = object.getClass().getMethod(methodName, paramTypes);
        //传入对象,参数
        method.invoke(object, args);
    }
}

//具体观察者1
class Observer1{
    public void watch(String name,Boolean flag,Integer age){
        System.out.println("xixiix:"+name+flag+age);
    }
}
//具体观察者2
class Observer2{
    public void see(String name,Integer age){
        System.out.println("哈哈:"+name+"---age:"+age);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值