背景
放假通知,有学生,老师,食堂师傅,领导. 每个代表一个触点渠道.每个渠道放假时间不一样.这个时候可以使用观察者模式.(也叫发布订阅模式).
上代码
订阅者核心接口,所有订阅者都要实现该接口
package com.integral.design.publisher;
import java.io.File;
/**
* @oauth: qiangSW
* @date: 2020/4/24 16:39
* @description: com.integral.design.publisher
* @doc:
*/
public interface EventListener {
/*核心接口,所有观察者都通过是实现该接口,实现通知
* 通知所有观察者,就可以实现通知该接口的所有实现类,达到通知所有的观察者目的
* */
public void update(Long channel, String desc);
}
订阅者实现
package com.integral.design.publisher;
/**
* @oauth: qiangSW
* @date: 2020/4/24 17:01
* @description: com.integral.design.publisher
* @doc:
*/
public class Channel1 implements EventListener {
@Override
public void update(Long channel, String desc) {
System.out.println("渠道" + channel + "收到通知信息:" + desc);
}
}
package com.integral.design.publisher;
/**
* @oauth: qiangSW
* @date: 2020/4/24 17:02
* @description: com.integral.design.publisher
* @doc: 订阅者
*/
public class Channel2 implements EventListener {
@Override
public void update(Long channel, String desc) {
System.out.println("渠道" + channel + "收到通知信息:" + desc);
}
}
基础发布(该地方用于解耦)
package com.integral.design.publisher;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
/**
* @oauth: qiangSW
* @date: 2020/4/24 16:31
* @description: com.integral.design.publisher
* @doc: 基础发布者
*/
public class EventManage {
Map<Long, List<EventListener>> listeners = Maps.newHashMap();
/*通知类别*/
public EventManage(Long... operations) {
for (Long operation : operations) {
this.listeners.put(operation, Lists.newArrayList());
}
}
/*每个类别添加一个订阅者*/
public void subscribe(Long chanel, EventListener eventListener) {
List<EventListener> eventListeners = this.listeners.get(chanel);
if (CollectionUtils.isEmpty(eventListeners)) {
return;
}
eventListeners.add(eventListener);
}
/*移除订阅*/
public void reoverSubscribe(Long chanel, EventListener eventListener) {
List<EventListener> eventListeners = this.listeners.get(chanel);
if (CollectionUtils.isEmpty(eventListeners)) {
return;
}
eventListeners.remove(eventListener);
}
/*通知*/
public void notify(Long chanel, String desc) {
List<EventListener> eventListeners = this.listeners.get(chanel);
eventListeners.stream().forEach(each -> {
each.update(chanel, desc);
});
}
}
业务功能(发布放假)
package com.integral.design.publisher;
/**
* @oauth: qiangSW
* @date: 2020/4/24 16:51
* @description: com.integral.design.publisher
* @doc: 发布放假通知
*/
public class HaveHoliday {
private EventManage eventManage;
private String desc_1 = "疫情原因放假2个月";
private String desc_2 = "疫情原因放假1个月";
public void notifyAllChannel() {
this.eventManage = new EventManage(1l,2l);
this.eventManage.subscribe(1l, new Channel1());
this.eventManage.subscribe(2l, new Channel2());
this.eventManage.notify(2l, desc_2);
this.eventManage.notify(1l, desc_1);
}
public static void main(String[] args) {
HaveHoliday haveHoliday = new HaveHoliday();
haveHoliday.notifyAllChannel();
}
}
代码运行结果
all\4.6.3\hutool-all-4.6.3.jar" com.integral.design.publisher.HaveHoliday
渠道2收到通知信息:疫情原因放假1个月
渠道1收到通知信息:疫情原因放假2个月
Process finished with exit code 0