事情监听设计模式(通俗易懂)
- 这样一个场景:小狗要吃饭,爸爸妈妈收到他吃饭的消息
- 有哪些类呢
- Dog:小狗,要被人监听了(事件源)
- PeopleEventLister:监听者的抽象接口,到时具体哪个类要监听小狗吃饭就要实现他
- PeopleListersManager:管理监听者的类
代码
package com.example.demo.event;
import java.util.EventObject;
/**
* @program: demo
* @description: 小狗类
* @author: Wei Zeng
* @create: 2020-08-10 15:48
*/
public class Dog extends EventObject {
/**
* 监听管理器(它设置哪些人要要偷听小狗做事情)
*/
private PeopleListersManager peopleListersManager;
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public Dog(Object source) {
super(source);
this.peopleListersManager = (PeopleListersManager) source;
}
/**
* 小狗吃饭了 你的是业务就写业务触发的动作
*/
void eate(){
System.out.println(this.getClass().getName() + "我要吃饭了");
if (peopleListersManager != null){
// 叫监听管理器通知监听者
peopleListersManager.notifyPeople();
}
}
}
package com.example.demo.event;
import java.util.EventListener;
/**
* @program: demo
* @description: 监听者共同的接口
* @author: Wei Zeng
* @create: 2020-08-10 15:53
*/
public interface PeopleEventLister extends EventListener {
void receive();
}
package com.example.demo.event;
/**
* @program: demo
* @description: 爸爸 具体的监听者
* @author: Wei Zeng
* @create: 2020-08-10 16:08
*/
public class Father implements PeopleEventLister{
@Override
public void receive() {
// 做Father一些业务操作
System.out.println(this.getClass().getName() + "收到到信息");
}
}
package com.example.demo.event;
/**
* @program: demo
* @description: 妈妈 具体的监听者
* @author: Wei Zeng
* @create: 2020-08-10 16:10
*/
public class Mom implements PeopleEventLister {
@Override
public void receive() {
// 做Mom一些业务操作
System.out.println(this.getClass().getName() + "收到信息");
}
}
package com.example.demo.event;
import lombok.SneakyThrows;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
/**
* @program: demo
* @description: 监听器管理中心
* @author: Wei Zeng
* @create: 2020-08-10 15:50
*/
public class PeopleListersManager {
/**
* 并发控制工具
*/
private Semaphore semaphore = new Semaphore(1);
/**
* 监听者集合(ps用的是不安全集合,需要用到并发控制工具,假如你用安全的集合就可以不用并发控制工具)
*/
private final List<PeopleEventLister> peopleEventListers = new ArrayList<PeopleEventLister>();
/**
* 添加监听者
* @param peopleEventLister
*/
@SneakyThrows
void addPeople(PeopleEventLister peopleEventLister){
semaphore.acquire(1);
peopleEventListers.add(peopleEventLister);
semaphore.release(1);
}
/**
* 移除监听者
* @param peopleEventLister
*/
@SneakyThrows
void removerPeople(PeopleEventLister peopleEventLister){
semaphore.acquire(1);
peopleEventListers.remove(peopleEventLister);
semaphore.release(1);
}
/**
* 通知所有监听者
*/
@SneakyThrows
void notifyPeople(){
semaphore.acquire(1);
if (peopleEventListers.size() > 0){
for (PeopleEventLister peopleEventLister : peopleEventListers) {
peopleEventLister.receive();
}
}
semaphore.release(1);
}
}
package com.example.demo.event;
/**
* @program: demo
* @description: 测试类
* @author: Wei Zeng
* @create: 2020-08-10 16:13
*/
public class Test {
public static void main(String[] args) {
// 监听对象管理器
PeopleListersManager peopleListersManager = new PeopleListersManager();
Father father = new Father();
Mom mom = new Mom();
// 添加要监听的人
peopleListersManager.addPeople(father);
peopleListersManager.addPeople(mom);
// 被监听的小狗
Dog dog = new Dog(peopleListersManager);
// 小狗的动作
dog.eate();
}
}