美文网首页
13.观察者模式

13.观察者模式

作者: 0x70e8 | 来源:发表于2018-03-20 20:04 被阅读0次

    1.是什么

    观察者定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个对象主题,当这个对象发送变化(执行什么方法了),会通知所有的观察者,观察者会做出对应的action。
    此模式也叫发布-订阅模式,监听者就是订阅者,被监听者是发布者,也就是主题。

    2.怎么用

    比较简单,直接看示例代码。

    /*
    主题接口
    */
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class Subject {
    
        private List<IObserver> listeners = new ArrayList<>();
    
        public void addListener(IObserver listener) {
            listeners.add(listener);
        }
    
        public void removeListener(IObserver listener) {
            listeners.remove(listener);
        }
    
        public void clearListener() {
            listeners.clear();
        }
    
        void notifyListener() {
            for (IObserver o : listeners) {
                o.action();
            }
        }
    
        /**
         * @return the listeners
         */
        public List<IObserver> getListeners() {
            return listeners;
        }
    
        public abstract void startWork();
    
    }
    
    
    /**
     * 主题实现类
     *
     */
    public class TVSubject extends Subject {
    
        @Override
        public void startWork() {
            notifyListener();
            System.out.println("开始看电视");
    
        }
    
    }
    
    
    // 观察者接口
    public interface IObserver {
    
        public void action();
    }
    
    // 观察者实现
    public class WatchTVObeserver implements IObserver {
    
        @Override
        public void action() {
            System.out.println("告诉家长他又在看电视");
    
        }
    
    }
    
    // client
    /**
     * 观察者模式</br>
     * 观察到一看电视就通知家长</br>
     * 作用类似于局部的拦截器</br>
     * 拦截某个具体方法 </br>
     * 只是拦截器可能是使用动态代理等实现,属于动态拦截</br>
     * 
     * @author shaoyuxia
     *
     */
    public class Client {
    
        public static void main(String[] args) {
            IObserver ad = new WatchTVObeserver();
            TVSubject sub = new TVSubject();
            sub.addListener(ad);
            sub.addListener(new IObserver() {
    
                @Override
                public void action() {
                    System.out.println("开始跳出弹窗");
    
                }
            });
            sub.startWork();
    
        }
    
    }
    

    相关文章

      网友评论

          本文标题:13.观察者模式

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