本文仅供学习交流使用,侵权必删。
不作商业用途,转载请注明出处
WHAT 什么是观察者模式
观察者UML观察者模式(Observer Design Pattern)就是对象之间存在一对多的依赖关系,当被依赖对象(被观察者)的状态发生改变的时候,所有依赖对象(观察者)都会收到通知信息。
观察者模式在很多框架都有应用到,像Google Guava的EventBus以及Spring Framework等都用到观察者模式。
WHY 为什么使用观察者模式
优点
- 将观察者和被观察者进行解耦,符合单一职责原则。
- 提高扩展性,如果需要再添加新的业务功能,只需要添加新的观察者即可,无需修改原来的代码
缺点
- 需要通知的观察者较多的话,这个通知过程耗费时间较长
HOW观察者模式的实现(JAVA)
场景:一个用户注册接口,在注册主流程完成后,通知观察者执行对应的逻辑。
- 观察者接口
/**
* 观察者接口和对应的实现类
*/
public interface Observer {
void execute(Message message);
}
/**
* 邮件发送
*/
public class EmailObserver implements Observer {
@Override
public void execute(EventMessage message) {
System.out.println("EmailObserver execute");
}
}
/**
* 增加积分
*/
public class RewardPointObserver implements Observer {
@Override
public void execute(EventMessage message) {
System.out.println("RewardPointObserver execute");
}
}
- 事件消息
public class EventMessage {
private String id;
private String data;
private Date createTime;
public EventMessage(String data) {
this.id = UUID.randomUUID().toString();
this.data = data;
this.createTime = new Date();
}
public String getId() {
return id;
}
public String getData() {
return data;
}
public Date getCreateTime() {
return createTime;
}
}
- 被观察者:用户接口和实现类
/**
* 用户注册服务
*/
public interface IUserService {
void register();
}
/**
* 用户服务实现类
*/
public class UserServiceImpl implements IUserService {
private static List<Observer> observers = new ArrayList<>();
static {
observers.add(new EmailObserver());
observers.add(new RewardPointObserver());
}
@Override
public void register() {
EventMessage message = new EventMessage("{'user_name':'kg_papa','email':'xxx@163.com'}");
observers.forEach(observer -> observer.execute(message));
}
}
这个功能场景有个地方可以优化下,对于通知观察者这个操作,我们可以通过异步的方式进行通知,这样能够缩短整个注册功能的执行时间
网友评论