学习笔记:设计模式之观察者模式

本文仅供学习交流使用,侵权必删。
不作商业用途,转载请注明出处

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 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':'[email protected]'}");
        observers.forEach(observer -> observer.execute(message));
    }
}

这个功能场景有个地方可以优化下,对于通知观察者这个操作,我们可以通过异步的方式进行通知,这样能够缩短整个注册功能的执行时间

持续更新...

你可能感兴趣的:(学习笔记:设计模式之观察者模式)