A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大蓝鲸Java 于 2017-12-1 12:38 编辑

              【南京校区】常见的设计模式--观察者模式(Observer)

- 概述:在javaweb阶段,我们会学习到Listener,它是基于观察者模式设计的.

- 观察者模式又叫做发布-订阅(Publish/Subsribe)模式

        观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.
        这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.
   
        观察者模式结构图
   
   
   
        具体代码设计
        1.定义两个接口(或抽象类),分别是观察者和被观察者
        /**
         * 被观察者
         */
        public interface Observable {
        
            /**
             * 添加观察者
             * @param observer
             */
            public void addObserver(Observer observer);
            
            /**
             * 移除观察者
             * @param observer
             */
            public void removeObserver(Observer observer);
            
            /**
             * 通知观察者
             * @param str
             */
            public void notifyObserver(String str);
        }

   
        /**
         * 观察者
         */
        public interface Observer {
        
            /**
             * 获得被观察的变化
             * @param str
             */
            public void update(String str);
        }

   
        2.写两类实现观察者和被观察者的接口
        /**
         * 创建被观察者实体类
         */
        public class ConcreteObservable implements Observable{
        
            //创建一个集合保存观察者
            private List<Observer> observerList = new ArrayList<>();
            
            @Override
            public void addObserver(Observer observer) {
                //添加观察者到集合
                observerList.add(observer);
            }
        
            @Override
            public void removeObserver(Observer observer) {
                //从集合中移除观察者
                observerList.remove(observer);
            }
        
            @Override
            public void notifyObserver(String str) {
                //通知集合中的每一个观察者
                for (int i = 0; i < observerList.size(); i++) {
                    Observer observer = observerList.get(i);
                    observer.update(str);
                }
            }
        }   

        
        /**
         * 创建观察者实体类
         */
        public class ConcreteObserver implements Observer {
        
            @Override
            public void update(String str) {
                System.out.println("收到通知: " + str);
            }
        }

   
        3.编写测试类
        public class Test {
            public static void main(String[] args) {
                //创建被观察者对象
                Observable observable = new ConcreteObservable();
               
                //创建观察者
                Observer observer1 = new ConcreteObserver();
                Observer observer2 = new ConcreteObserver();
                Observer observer3 = new ConcreteObserver();
               
                //添加观察者
                observable.addObserver(observer1);
                observable.addObserver(observer2);
                observable.addObserver(observer3);
               
                //通知所有观察者
                observable.notifyObserver("进来按摩吧...");
               
                System.out.println("===============================");
               
                //移除一个观察者
                observable.removeObserver(observer1);
                observable.notifyObserver("刚刚走了一个...");
            }
        }

- java中内置的观察者模式

        java中的内置观察者模式有两个类:一个是Observable被观察者类,一个是Observer观察者接口。
        注意:调用notifyObservers()方法之前,必须先调用setChanged()方法。

        具体代码实现:
        1.创建观察者和被观察者的具体实现类
        /**
         * 创建一个被观察者的实现类
         */
        public class MyObservable extends Observable {
            @Override
            protected synchronized void setChanged() {
                super.setChanged();
            }
        }

        /**
         * 创建一个观察者的实现类
         */
        public class MyObserver implements Observer {
            @Override
            public void update(Observable o, Object arg) {
                System.out.println(o.getClass().getSimpleName() + "====获得update====" + arg);
            }
        }

        2.创建测试类
        public class Test {
            public static void main(String[] args) {
                //创建被观察者对象
                MyObservable observable = new MyObservable();
                //创建观察者对象
                Observer observer = new MyObserver();
                //添加观察者
                observable.addObserver(observer);
                //调用notifyObservers方法之前,必须先调用setChanged()方法
                observable.setChanged();
                //通知所有的观察者
                observable.notifyObservers("hahaha");
            }
        }

6 个回复

倒序浏览
郭俊峰老师 来自手机 高级黑马 2017-12-4 12:29:08
沙发
可以把设计模式好好总结一下
回复 使用道具 举报
666设计模式一直是代码中很绕的地方 感谢分享
回复 使用道具 举报
解决了我的苦恼很久的问题啊~~
回复 使用道具 举报
666,学习了。
回复 使用道具 举报
回复 使用道具 举报
6666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马