观察者模式基本概念
一个对象状态改变,通知给其他所有的对象
观察者模式的应用场景
Zk的事件监听、分布式配置中心刷新配置文件、业务中群发不同渠道消息
观察者模式的类图

简单的实现ObServer观察者
定义ObServer接口
public interface MayiktObServer {
void sendMsg(JSONObject jsonObject);
}
@Component
public class EmailServer implements MayiktObServer {
public void sendMsg(JSONObject jsonObject) {
System.out.println(Thread.currentThread().getName() + "2.短信观察者监听");
}
}
@Component
public class SmsObServer implements MayiktObServer {
public void sendMsg(JSONObject jsonObject) {
System.out.println(Thread.currentThread().getName()+"使用观察者监听短信");
}
}
主题通知所有观察者
@Component public class MayiktSmsSubject {
private ExecutorService executorService;
private List<MayiktObServer> listObServer = new ArrayList<MayiktObServer>();
public MayiktSmsSubject() {
executorService = Executors.newFixedThreadPool(10); }
public void addObServer(MayiktObServer obServer) {
listObServer.add(obServer); }
public void deleteObServer(MayiktObServer obServer) {
listObServer.remove(obServer); }
public void notifyObServer(final JSONObject jsonObject) {
for (final MayiktObServer obServer : listObServer) {
executorService.execute(new Runnable() {
public void run() {
obServer.sendMsg(jsonObject); } });
} }
}
|
项目启动注册观察者
@Component public class StartService implements ApplicationRunner {
@Autowired
private MayiktSmsSubject mayiktSmsSubject;
@Autowired
private EmailServer emailServer;
@Autowired
private EmailServer smsObServer;
@Override
public void run(ApplicationArguments args) throws Exception {
mayiktSmsSubject.addObServer(emailServer);
mayiktSmsSubject.addObServer(smsObServer); } }
|
@Autowired
private MayiktSmsSubject mayiktSmsSubject;
@RequestMapping("/addOrder")
public String addOrder() {
log.info("1.调用数据库下单订单代码:"); JSONObject jsonObject = new JSONObject(); jsonObject.put("sms", "1865891111"); jsonObject.put("email", "[email protected]"); // log.info("2.发送短信代码"); // log.info("3.发送邮件代码"); mayiktSmsSubject.notifyObServer(jsonObject);
return "success"; }
|
实现自动化注册
基于Spring事件通知实现
定义消息实体类
public class UserMessageEntity extends ApplicationEvent {
private String email;
private String phone;
private String userId;
/** * Create a new ApplicationEvent. * * @param source the object on which the event initially occurred (never {@code null}) */ public UserMessageEntity(Object source) {
super(source); }
public UserMessageEntity(Object source, String email, String phone) {
super(source);
this.email = email;
this.phone = phone; }
@Override
public String toString() {
return "email:" + email + ",phone:" + phone; } }
|
定义事件通知
@Component public class EmailListener implements ApplicationListener<UserMessageEntity> {
@Override
public void onApplicationEvent(UserMessageEntity event) { System.out.println("eamil:"+event.toString()); } }
@Component public class SmsListener implements ApplicationListener<UserMessageEntity> {
@Override
public void onApplicationEvent(UserMessageEntity event) { System.out.println("sms:" + event.toString()); }
}
|
@Autowired private ApplicationEventPublisher applicationEventPublisher; @RequestMapping("/addOrder2") public String addOrder2() {
log.info("1.调用数据库下单订单代码:" + mayiktSmsSubject); UserMessageEntity messageEntity = new UserMessageEntity(this, "[email protected]", "1865891111");
applicationEventPublisher.publishEvent(messageEntity);
return "success"; }
|
总结:就是一个事件改变调用方法通知其他方法做出处理,上面就是新增订单之后调用发短信和邮件的接口。
每一行的代码都有它的含义,多问一句为什么?编程一点都不难,一切都只是数据的演变罢了,只要理清数据的流向,思路清晰
来着于每特学院