美文网首页
设计模式三(观察者模式)

设计模式三(观察者模式)

作者: Android师哥 | 来源:发表于2020-04-20 12:02 被阅读0次
    NightRain.png

    定义

    对象之间一对多的关系,当一个对象改变状态,所有依赖于它的对象都得到通知。

    使用场景

    • 事件多级触发
    • 消息列队、总线

    示例

    Subject(被观察者)

    /**
     * 被观察者
     * 观察主题,负责处理观察对象。
     */
    public class EventSubject {
        private ArrayList<EventObserver> mEventObservers;
        private static volatile EventSubject mEventSubject = null;
    
        private EventSubject() {
            mEventObservers = new ArrayList<>();
        }
    
        public static EventSubject getInstance() {
            if (mEventSubject == null) {
                synchronized (EventSubject.class) {
                    if (mEventSubject == null) {
                        mEventSubject = new EventSubject();
                    }
                }
            }
            return mEventSubject;
        }
    
        /**
         * 注册观察者
         *
         * @param eventObserver 观察者
         */
        public void registerObserver(EventObserver eventObserver) {
            if (mEventObservers != null) {
                if (!mEventObservers.contains(eventObserver)) {
                    mEventObservers.add(eventObserver);
                }
            }
        }
    
        /**
         * 取消已注册观察者
         *
         * @param eventObserver 已注册观察者
         */
        public void unRegisterObserver(EventObserver eventObserver) {
            if (mEventObservers != null && mEventObservers.size() > 0) {
                mEventObservers.remove(eventObserver);
            }
        }
    
        /**
         * 通知所有观察者
         *
         * @param message 通知内容
         */
        public void notifyObserver(String message) {
            if (mEventObservers != null && mEventObservers.size() > 0) {
                for (EventObserver eventObserver : mEventObservers) {
                    eventObserver.sendMessage(message);
                }
            }
        }
    }
    

    Observer(观察者)

    /**
     * 观察者
     * 定义一个接口,得到观察主题的通知后更新自己。
     */
    public class EventObserver {
        private static final String TAG = "EventObserver";
        private String mName;
    
        public EventObserver(String name) {
            this.mName = name;
        }
    
        public void sendMessage(String message) {
            Log.i(TAG, mName + " 收到消息: " + message);
        }
    }
    

    使用

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            EventSubject.getInstance().registerObserver(new EventObserver("用户一"));
            EventSubject.getInstance().registerObserver(new EventObserver("用户二"));
            EventSubject.getInstance().registerObserver(new EventObserver("用户三"));
            EventSubject.getInstance().registerObserver(new EventObserver("用户四"));
            EventSubject.getInstance().registerObserver(new EventObserver("用户五"));
            EventSubject.getInstance().notifyObserver("作者发布文章《代码的世界》");
        }
    
    Result.png

    相关文章

      网友评论

          本文标题:设计模式三(观察者模式)

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