java中的监听器模式

监听器模式的角色

1、事件源 event source
2、事件对象 event object
3、事件监听器 event listener

过程

1、创建事件源
2、向事件源注册事件监听器
3、在事件源监控方法里面创建事件对象,所有事件监听器获取事件对象并调用

EventObject

事件对象持有事件源的引用

package java.util;
public class EventObject implements java.io.Serializable {   
private static final long serialVersionUID = 5516075349620653480L;
    /** 事件源 */
    protected transient Object  source;
    public EventObject(Object source) {
        if (source == null)
            throw new IllegalArgumentException("null source");
        this.source = source;
    }
    public Object getSource() {
        return source;
    }
    public String toString() {
        return getClass().getName() + "[source=" + source + "]";
    }
}

EventListener

package java.util;
public interface EventListener {
}

例子1 监听按钮的点击事件

1、事件源 event source:
2、事件对象 event object:
3、事件监听器 event listener:
在这里插入图片描述

事件源 event source: Button

事件源持有监听器数组的引用

@Data
public class Button {
	private String name;
	private List<ButtonListener> listeners;
	/** 注册监听器 */
	public void registerEventListener(ButtonListener listener) {
		listeners.add(listener);
	}
	public Button(String name) {
		super();
		this.name = name;
		listeners = new ArrayList<>();
	}
	public void click() {
		System.out.println("点击按钮");
		// 创建事件对象
		ButtonEvent e = new ButtonEvent(this);
		for(ButtonListener listener: listeners) {
			new Thread(()->{
				listener.buttonClicked(e);
			}).start();
		}
	}
}

事件对象 event object: ButtonEvent

事件对象持有事件源的引用

public class ButtonEvent extends EventObject {
	private static final long serialVersionUID = 3185848587777112305L;
	public ButtonEvent(Object source) {
		super(source);
	}
}

事件监听器 event listener: ButtonListener

public interface ButtonListener extends EventListener {
	/** 按钮点击事件 */
	public void buttonClicked(ButtonEvent e);
}
public class ButtonListenerImpl01 implements ButtonListener {
	@Override
	public void buttonClicked(ButtonEvent e) {
		Button button = (Button)e.getSource();
		System.out.println("source=" + button.getName());
		System.out.println("点击按钮事件");
	}
}

测试

public class ButtonDemo {
	public static void main(String[] args) {
		Button button = new Button("提交按钮");
		button.registerEventListener(new ButtonListenerImpl01());
		button.registerEventListener((e) ->{
			// Button button2 = (Button)e.getSource();
			System.out.println("按钮释放事件");
		});
		button.registerEventListener((e) ->{
			System.out.println("其他事件");
		});
		button.click();
	}
}
/**打印结果:
点击按钮
按钮释放事件
其他事件
source=提交按钮
点击按钮事件
*/

例子2 监听用户的保存和删除操作

在这里插入图片描述

事件源 event source: ManagerUserService

监听用户的保存和删除操作

@Data
public class ManagerUser {
	public ManagerUser(String name) {
		super();
		this.name = name;
	}
	private String id;
	private String name;
}
/** 用户服务类 */
public class ManagerUserService {
	{
		listeners = new ArrayList<>();
	}
	private List<ManagerUserListener> listeners;
	public void registerEventListener(ManagerUserListener listener) {
		listeners.add(listener);
	}
	/** 保存用户 */
	public ManagerUser saveUser(ManagerUser user) {
		_listen(ManagerUserEvent.TYPE_BEFORE_SAVE, user);
		System.out.println(String.format("保存用户:%s", user));
		user.setId("001");
		_listen(ManagerUserEvent.TYPE_AFTER_SAVE, user);
		return user;
	}
	/** 删除用户 */
	public void deleteUser(ManagerUser user) {
		_listen(ManagerUserEvent.TYPE_BEFORE_DELETE, user);
		System.out.println(String.format("删除用户:%s", user));
		_listen(ManagerUserEvent.TYPE_AFTER_DELETE, user);
	}
	private void _listen(String type, ManagerUser user) {
		_action(new ManagerUserEvent(this, type, user));
	}
	private void _action(ManagerUserEvent e) {
		if(listeners == null || listeners.isEmpty()) {
			return;
		}
		for(ManagerUserListener listener: listeners) {
			new Thread(()->{
				listener.action(e);
			}).start();
		}
	}
}

事件对象 event object: ManagerUserEvent

@Data
@EqualsAndHashCode(callSuper=false)
public class ManagerUserEvent extends EventObject {
	private static final long serialVersionUID = 3185848587777112305L;

	public static String TYPE_BEFORE_SAVE = "before_save";
	public static String TYPE_AFTER_SAVE = "after_save";
	public static String TYPE_BEFORE_DELETE = "before_delete";
	public static String TYPE_AFTER_DELETE = "after_delete";
	private String type;
	private ManagerUser user;

	public ManagerUserEvent(Object source) {
		super(source);
	}
	public ManagerUserEvent(Object source, String type, ManagerUser user) {
		super(source);
		this.type = type;
		this.user = user;
	}
}

事件监听器 event listener: ButtonListener

public interface ManagerUserListener extends EventListener {
	public void action(ManagerUserEvent e);
}

测试 ManagerUserDemo

注册了两个匿名的监听器

public class ManagerUserDemo {
	public static void main(String[] args) {
		ManagerUserService userService = new ManagerUserService();
		userService.registerEventListener(e->{
			// ManagerUserService service = (ManagerUserService)e.getSource();
			ManagerUser u = e.getUser();
			if(ManagerUserEvent.TYPE_BEFORE_SAVE.equals(e.getType())) {
				System.out.println("监听保存前操作..." + u);
			} else if(ManagerUserEvent.TYPE_AFTER_SAVE.equals(e.getType())) {
				System.out.println("监听保存后操作..." + u);
			}
		});
		userService.registerEventListener(e->{
			ManagerUser u = e.getUser();
			if(ManagerUserEvent.TYPE_BEFORE_DELETE.equals(e.getType())) {
				System.out.println("监听删除前操作..." + u);
			} else if(ManagerUserEvent.TYPE_AFTER_DELETE.equals(e.getType())) {
				System.out.println("监听删除后操作..." + u);
			}
		});

		ManagerUser user = new ManagerUser("小爱");
		userService.saveUser(user);
		userService.deleteUser(user);
	}
}
/* 打印结果:
监听保存前操作...ManagerUser(id=null, name=小爱)
保存用户:ManagerUser(id=null, name=小爱)
监听保存后操作...ManagerUser(id=001, name=小爱)
删除用户:ManagerUser(id=001, name=小爱)
监听删除前操作...ManagerUser(id=001, name=小爱)
监听删除后操作...ManagerUser(id=001, name=小爱)
*/

例子3 springboot中的监听器模式

使用目标:
等待某个spring的Bean对象完成初始化后,在执行其他操作
总共使用4个类进行实验
EventConfig(配置类)、TestObject、MyEventObject(事件对象)、MyEventListener(事件监听器)

@Configuration
@Order(9999)
@Slf4j
public class EventConfig {
	@Autowired TestObject testObject;
	@PostConstruct
	public void init() {
		log.info("EventConfig.init...");
		testObject.load();
	}
}
@Component
@Slf4j
public class TestObject implements ApplicationContextAware {
	private ApplicationContext applicationContext;
	public void load() {
		applicationContext.publishEvent(new MyEventObject(this, MyEventObject.Step.START));
		log.info("TestObject正在初始化...");
		log.info("TestObject初始化完成...");
		applicationContext.publishEvent(new MyEventObject(this, MyEventObject.Step.STOP));
	}
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}
}
@Data
public class MyEventObject extends ApplicationEvent {
	public enum Step {START, STOP}
	MyEventObject.Step step;
	public MyEventObject(TestObject source, MyEventObject.Step step) {
		super(source);
		this.setStep(step);
	}
}

@Component
@Slf4j
public class MyEventListener implements  ApplicationListener<MyEventObject> {
	public void doSomething() {
		log.info("等待TestObject完全初始化在执行其他任务...");
	}
	@Override
	public void onApplicationEvent(MyEventObject event) {
		if(MyEventObject.Step.START.equals(event.getStep())) {
			log.info("TestListener-正在处理start事件...");
		} else if(MyEventObject.Step.STOP.equals(event.getStep())) {
			log.info("TestListener-正在处理stopt事件...");
			doSomething();
		}
	}
}

springboot项目启动后打印信息:

EventConfig.init...
TestListener-正在处理start事件...
TestObject正在初始化...
TestObject初始化完成...
TestListener-正在处理stopt事件...
等待TestObject完全初始化在执行其他任务...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26264237

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值