美文网首页
观察者模式

观察者模式

作者: 吃瓜群众666 | 来源:发表于2019-10-30 12:22 被阅读0次

    定义了对象间的一种一对多的依赖关系,当一个对象(目标对象)的状态发生改变时,所有依赖于它的对象(观察者对象)都会得到通知。

    实现:

    1.定义一个抽象的观察者,里面有一个更新状态的方法供子类自己去实现。

    /**
     * 抽象的观察者
     */
    public interface Observer {
        void updateState(Subject subject);
    }
    
    
    
    2.定义一个目标对象父类,里面包含了一个观察者链表和注册、反注册、广播通知所有观察者状态更新的方法。
    /**
     * 目标对象父类(被观察者)
     */
    public class Subject {
        private List<Observer> observerList=new LinkedList<>();
        public void register(Observer observer){
            observerList.add(observer);
        }
        public void unRegister(Observer observer){
            observerList.remove(observer);
        }
    
        public void notifyUpdate(){
            for (Observer observer:observerList){
                observer.updateState(this);
            }
        }
    }
    
    3.定义一个具体的目标对象类,决定什么时候去进行广播通知。
    /**
     * 具体的目标对象类(被观察者)
     */
    public class WeatherSuject extends Subject {
    
        private String weatherState;
        public String getWeatherState() {
            return weatherState;
        }
    
        /**
         * 设置新的天气状态的时候进行广播通知
         * @param weatherState
         */
        public void setWeatherState(String weatherState) {
            this.weatherState = weatherState;
            super.notifyUpdate();
        }
    }
    
    
    4.定义一个具体的观察者类,自己去实现得到广播通知之后状态更新的方法。
    /**
     * 具体的观察者
     */
    public class WeatherObserver implements Observer {
        private String weatherState;
        private String name;
        private String activity;
        @Override
        public void updateState(Subject subject) {
            weatherState=((WeatherSuject)subject).getWeatherState();
            System.out.println(name+":"+weatherState+",我准备去"+activity);
        }
    
        public String getWeatherState() {
            return weatherState;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getActivity() {
            return activity;
        }
    
        public void setActivity(String activity) {
            this.activity = activity;
        }
    
    }
    
    
    5.调用
    public static void main(String args[]){
        //1.创建目标
        WeatherSuject weatherSuject=new WeatherSuject();
    
        //2.创建观察者
        WeatherObserver observerSu=new WeatherObserver();
       observerSu.setName("苏小斯");
       observerSu.setActivity("图书馆");
    
        WeatherObserver observerYu=new WeatherObserver();
        observerYu.setName("吃瓜群众");
        observerYu.setActivity("爬山");
    
        //3.观察者注册
        weatherSuject.register(observerSu);
        weatherSuject.register(observerYu);
    
        //发布事件更新
        weatherSuject.setWeatherState("明天天气晴朗,24度,阵风3级");
    
        //当确定不需要再接受广播事件的时候应将其取消
        weatherSuject.unRegister(observerSu);
        weatherSuject.unRegister(observerYu);
    }
    
    6.打印输出
    苏小斯:明天天气晴朗,24度,阵风3级,我准备去图书馆
    吃瓜群众:明天天气晴朗,24度,阵风3级,我准备去爬山
    

    相关文章

      网友评论

          本文标题:观察者模式

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