美文网首页Android设计模式Android开发经验谈Android开发
Android设计模式之(11)----观察者模式

Android设计模式之(11)----观察者模式

作者: Ch3r1sh | 来源:发表于2017-08-24 10:52 被阅读59次

    观察者模式

    观察者模式属于行为模式。

    主要用于解耦观察者与被观察者之间的联系。实现观察者一对一或者一对多的关系,当被观察者有状态改变的时候通知观察者,观察者根据改变的状态做出相应的事件动作。

    使用场景

    • 消息队列,事件总线情况
    • 数据状态更新,对象变化
    • 对象行为关联变化

    代码示例

    观察者与被观察者用接口实现具体方法。

    (一) 观察者刷新接口

    public interface ObserverListener {
    
        void update(Object o);
    }
    

    (二)被观察者接口

    public interface Subject {
        void  register(ObserverListener observer);
        void  unRegister(ObserverListener observer);
        void  notifyChanged( Object arg);
    }
    

    被观察者我们需要对其进行绑定,销毁绑定以及通知的具体事务方法

    (三)定义一个观察者的管理器

    public class ObserverManager implements Subject {
        private static ObserverManager observerManager;
        //观察者接口集合
        private List<ObserverListener> list = new ArrayList<>();
    
        //DCL双重加锁单利
        public static ObserverManager getInstance() {
            if (null == observerManager) {
                synchronized (ObserverManager.class) {
                    if (null == observerManager) {
                        observerManager = new ObserverManager();
                    }
                }
    
            }
            return observerManager;
    
        }
        //注册
    
        @Override
        public void register(ObserverListener observer) {
            if (null != observer) {
                list.add(observer);
            }
    
        }
        //反注册
    
        @Override
        public void unRegister(ObserverListener observer) {
            if (null != observer) {
                list.remove(observer);
            }
        }
    
        //通知
        @Override
        public void notifyChanged(Object o) {
            for (ObserverListener observerListener : list) {
                observerListener.update(o);
            }
        }
    
    
    }
    

    实现被观察者的接口,因为观察者可能很多地方使用,使用单例将其封装使用。

    对于需要观察的对象使用list将其存储起来,需要的时候在进行获取。

    调用方式

    • 注册与销毁被观察者
      //注册
      ObserverManager.getInstance().register(this);
      //销毁
      ObserverManager.getInstance().unRegister(this);
        
    
    • 发送状态更新信息
     ObserverManager.getInstance().notifyChanged(person);
    
    
    • 更新状态
     //更新
       @Override
        public void update(Object o) {
            //更新
            
        }
    
    

    总结

    • 优点

      • 灵活方便使用
      • 解决观察者与被观察者的耦合
    • 缺点

      • 当有多个观察者,一个被观察者时,如果一个观察者卡顿,因为java默认顺序执行,会导致卡顿情况。

    github地址

    相关文章

      网友评论

        本文标题:Android设计模式之(11)----观察者模式

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