第四篇,观察者模式

 

观察者模式基本概念

 一个对象状态改变,通知给其他所有的对象

观察者模式的应用场景

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";
}

 

总结:就是一个事件改变调用方法通知其他方法做出处理,上面就是新增订单之后调用发短信和邮件的接口。

每一行的代码都有它的含义,多问一句为什么?编程一点都不难,一切都只是数据的演变罢了,只要理清数据的流向,思路清晰

 

来着于每特学院