zoukankan      html  css  js  c++  java
  • 设计模式-观察者模式(Observer)

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

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

    角色和职责:

    1.被观察者(Observable)-Observable:

       被观察者对象,当需要被观察者的状态发生变化时,需要通知队列中所有观察者对象。Subscribe需要维持(添加,删除,通知)一个观察者对象的队列列表。

    2.被观察者具体实现(Concrete Observable)-Subscibe:

        被观察者具体实现,包含一些基本的属性状态及其他操作

    3.观察者(Observer)-Observer:

        当subscribe状态发生变化时,Observer对象将通过一个callback函数得到通知

    4.观察者具体实现Concrete Observer)-Observer1、Observer2:

        观察者具体实现,得到通知后将完成一些具体的业务逻辑处理

    UML图:

    具体代码:

    /**
     * 文章
     */
    public class Article {
        private String articleTitle;//文章标题
        private String articleContent;//文章内容
    
        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;
        }
    }
    import java.util.Observable;
    
    /**
     * 订阅号
     */
    public class Subscribe extends Observable {
        /**
         * 新增文章
         */
        public void insertArticle(Article article){
            //新增一篇文章
            System.out.println("新增一篇文章");
            this.setChanged();//观察者模式标记已更改
            this.notifyObservers(article);//告诉订阅者,这边的通知是依次通知
        }
    
    }
    import java.util.Observable;
    import java.util.Observer;
    
    /**
     * 订阅者1
     */
    public class Observer1 implements Observer {
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("订阅者1,收到订阅号的通知");
            Article article = (Article)arg;
            System.out.println("标题:"+article.getArticleTitle()+",内容:"+article.getArticleContent());
        }
    }
    import java.util.Observable;
    import java.util.Observer;
    
    /**
     * 订阅者2
     */
    public class Observer2 implements Observer {
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("订阅者2,收到订阅号的通知");
            Article article = (Article)arg;
            System.out.println("标题:"+article.getArticleTitle()+",内容:"+article.getArticleContent());
        }
    }
    public class Main {
        public static void main(String[] args) {
            Article article = new Article();
            article.setArticleTitle("圆周率的实现");
            article.setArticleContent("圆是一个圆圈。。。");
    
            Subscribe subscribe= new Subscribe();//订阅号
            subscribe.addObserver(new Observer1());//订阅者1
            subscribe.addObserver(new Observer2());//订阅者2
            subscribe.insertArticle(article);//订阅号新增一篇文章
        }
    }

     结果:

    新增一篇文章
    订阅者2,收到订阅号的通知
    标题:圆周率的实现,内容:圆是一个圆圈。。。
    订阅者1,收到订阅号的通知
    标题:圆周率的实现,内容:圆是一个圆圈。。。

    应用场景:

    • 倾听事件驱动程序设计中的外部事件
    • 监听某个对象的状态变化
    • 发布者/订阅者模型中,当一个外部被触发时,通知邮件列表中的订阅者

    源码地址:https://github.com/qjm201000/design_pattern_observer.git

  • 相关阅读:
    Oracle学习笔记<5>
    Oracle学习笔记<4>
    fabric动态获取远程目录列表
    fabric查看本地与远程主机信息
    fabric安装使用
    pexpect实现远程操作
    pexpect的pxssh类实现远程操作
    Most Distant Point from the Sea
    Art Gallery
    Rotating Scoreboard(半平面交模板题)
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10063735.html
Copyright © 2011-2022 走看看