zoukankan      html  css  js  c++  java
  • 第十九讲、观察者模式

    1.定义

    Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其它关联对象,自动刷新对象状态。

    Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持同步状态。

    2.观察者模式的角色和职责

    • Subject(被观察者)--被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加、删除、通知)一个观察者对象的队列列表。
    • ConcreteSubject--被观察者的具体实现。包含一些基本的属性状态及其他操作。
    • Observer(观察者)--接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
    • ConcreteObserver--观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

    3.观察者模式的结构

       

    4.Observer模式的典型应用

    • 侦听事件驱动程序设计中的外部事件
    • 侦听/监视某个对象的状态变化
    • 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。

     5.代码演示

    package test.com.observer;
    
    import java.util.Observable;
    /*
     * 被观察对象--Subject
     */
    public class Person extends Observable {
        private String name;
        private String sex;
        private int age;
        
        public Person() {
            super();
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
            //将被观察者的状态设置为已改变
            this.setChanged();
            //通知观察者
            this.notifyObservers();
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
            //将被观察者的状态设置为已改变
            this.setChanged();
            //通知观察者
            this.notifyObservers();
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
            //将被观察者的状态设置为已改变
            this.setChanged();
            //通知观察者
            this.notifyObservers();
        }
    }
    package test.com.observer;
    
    import java.util.Observable;
    import java.util.Observer;
    /*
     * 观察者--Observer
     */
    public class MyObserve implements Observer {
    
        @Override
        public void update(Observable arg0, Object arg1) {
            System.out.println("对象已被修改");
        }
    }
    package test.com.observer;
    /*
     * 测试类
     */
    public class MainClass {
        public static void main(String[] args) {
            Person per = new Person();
            //注册观察者
            per.addObserver(new MyObserve());
            //修改对象
            per.setAge(12);
            per.setName("张三");
            per.setSex("男");
        }
    }

     6.发布者/订阅者示例演示

    package test.com.observer2;
    /*
     * ConcreteSubject
     */
    public class Article {
        private String articleTitle;
        private String articleContent;
        public Article() {
            super();
        }
        public String getArticleTitle() {
            return articleTitle;
        }
        public void setArticleTitle(String articleTitle) {
            this.articleTitle = articleTitle;
        }
        public String getArticleContent() {
            return articleContent;
        }
        public void setArticleContent(String articleContent) {
            this.articleContent = articleContent;
        }
    }
    package test.com.observer2;
    
    import java.util.Observable;
    /*
     * 被观察者(Subject)--发布者
     */
    public class Publisher extends Observable {
        
        public void notice() {
            Article art = new Article();
            art.setArticleTitle("今天天气状况");
            art.setArticleContent("今天真是美好的一天,天气晴朗!");
            System.out.println("我发布了新的文章");
            //将被观察者的状态设置为已改变
            this.setChanged();
            //通知观察者
            this.notifyObservers(art);
        }
    }
    package test.com.observer2;
    
    import java.util.Observable;
    import java.util.Observer;
    /*
     * 观察者(Observer)--订阅者
     */
    public class Order implements Observer {
        //arg--被修改的对象
        @Override
        public void update(Observable o, Object arg) {
            Article art = (Article)arg;
            System.out.println("文章主题:" + art.getArticleTitle());
            System.out.println("文章内容:" + art.getArticleContent());
        }
    
    }
    package test.com.observer2;
    /*
     * 测试类
     */
    public class MainClass {
        public static void main(String[] args) {
            Publisher pub = new Publisher();
            pub.addObserver(new Order());
            pub.notice();
        }
    }
  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/zheaven/p/10191109.html
Copyright © 2011-2022 走看看