美文网首页
学习笔记:设计模式之观察者模式

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

作者: 大力papa | 来源:发表于2020-10-22 17:06 被阅读0次

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

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

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

    持续更新...

    相关文章

      网友评论

          本文标题:学习笔记:设计模式之观察者模式

          本文链接:https://www.haomeiwen.com/subject/lksumktx.html