zoukankan      html  css  js  c++  java
  • 观察者模式

    一、什么是观察者模式

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

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

    二、观察者模式的结构

    三、观察者模式的角色和职责

    Subject(被观察者)

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

    ConcreteSubject

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

    Observer(观察者)

      接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数的到通知。

    ConcreteObserver

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

    四、观察者模式的典型应用

      侦听事件驱动程序设计中的外部事件

      侦听/监视某个对象的状态变化

      发布者/订阅者模型中,当一个外部时间(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。

     

    文章实体

     1 package com.bingoogol.designpattern.observer;
     2 
     3 /**
     4  * 文章实体
     5  * 
     6  * @author bingoogol@sina.com
     7  */
     8 public class Article {
     9     private String title;
    10     private String content;
    11 
    12     public Article() {
    13     }
    14 
    15     public Article(String title, String content) {
    16         this.title = title;
    17         this.content = content;
    18     }
    19 
    20     public String getTitle() {
    21         return title;
    22     }
    23 
    24     public void setTitle(String title) {
    25         this.title = title;
    26     }
    27 
    28     public String getContent() {
    29         return content;
    30     }
    31 
    32     public void setContent(String content) {
    33         this.content = content;
    34     }
    35 
    36 }
    查看代码

    博客用户,被观察者

     1 package com.bingoogol.designpattern.observer;
     2 
     3 import java.util.Observable;
     4 
     5 /**
     6  * 博客用户,被观察者
     7  * 
     8  * @author bingoogol@sina.com
     9  */
    10 public class BlogUser extends Observable{
    11     
    12     private String name;
    13     
    14     
    15     public BlogUser() {
    16     }
    17     public BlogUser(String name) {
    18         this.name = name;
    19     }
    20 
    21     public void publish() {
    22         Article article = new Article("观察者模式", "模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态");
    23         System.out.println("博主:" + name + " 发布文章");
    24         System.out.println("文章标题:" + article.getTitle());
    25         System.out.println("文章内容:" + article.getContent());
    26         System.out.println("---------------------------------------------------------------");
    27         this.setChanged();
    28         this.notifyObservers(article);
    29     }
    30 
    31     public String getName() {
    32         return name;
    33     }
    34 
    35     public void setName(String name) {
    36         this.name = name;
    37     }
    38 }
    查看代码

    订阅者,观察者

     1 package com.bingoogol.designpattern.observer;
     2 
     3 import java.util.Observable;
     4 import java.util.Observer;
     5 
     6 /**
     7  * 订阅者,观察者
     8  * 
     9  * @author bingoogol@sina.com
    10  */
    11 public class MyObServer implements Observer {
    12     private String name;
    13     
    14     public MyObServer() {
    15     }
    16 
    17     public MyObServer(String name) {
    18         this.name = name;
    19     }
    20 
    21     @Override
    22     public void update(Observable o, Object arg) {
    23         Article article = (Article) arg;
    24         BlogUser blogUser = (BlogUser) o;
    25         System.out.println("订阅者:" + name + " 收到" + blogUser.getName() + "的文章");
    26         System.out.println("文章标题:" + article.getTitle());
    27         System.out.println("文章内容:" + article.getContent());
    28         System.out.println("---------------------------------------------------------------");
    29     }
    30 
    31     public String getName() {
    32         return name;
    33     }
    34 
    35     public void setName(String name) {
    36         this.name = name;
    37     }
    38     
    39 }
    查看代码

    启动类

     1 package com.bingoogol.designpattern.observer;
     2 
     3 /**
     4  * 启动类
     5  * 
     6  * @author bingoogol@sina.com
     7  */
     8 public class Main {
     9     public static void main(String[] args) {
    10         MyObServer obServer1 = new MyObServer("订阅者1");
    11         MyObServer obServer2 = new MyObServer("订阅者2");
    12         BlogUser blogUser = new BlogUser("博主1");
    13         blogUser.addObserver(obServer1);
    14         blogUser.addObserver(obServer2);
    15         blogUser.publish();
    16     }
    17 }
    查看代码

     

  • 相关阅读:
    [转]CentOS安装crontab及使用方法胡益兵
    Cython: CExtensions for Python
    freetds在UBUNTU下的安装
    用python写hiveclient 改善 ITeye技术网站
    Linux下连接MS Sql server 使用ODBC/FreeTDS组合(详细)_徒步旅行者的空间_百度空间
    现代软件构建系统的使用 CMake简介
    The Ex CS Grad Student: Running HQL from Python without using the Hive Standalone Server
    muduo 与 boost asio 吞吐量对比
    cmake与autoconf+automake的对比
    通过枚举返回指定字符结果[有时,好的程序就是一种规范,一种对事物的理解和认识,一种层次]
  • 原文地址:https://www.cnblogs.com/bingoogol/p/DesignPattern-observer.html
Copyright © 2011-2022 走看看