zoukankan      html  css  js  c++  java
  • 3、观察者设计模式

    1、观察者设计模式定义                                          

    观察者模式又叫发布-订阅(Publish/Subscribe)模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

    Subject类:抽象主题,把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象

    ConcreateSubject类:具体主题,将有关状态存入具体观察者对象;在具体主题的内部状态发生改变时,给所有登记过的观察者发出通知。

    Observer类:抽象观察者,为所有的具体观察者定义一个接口,当得到主题的通知时更新自己。

    ConcreateObserver类:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。

     

    2、代码实现                                                          

    a、subject抽象接口

    1 interface Subject {
    2     //添加观察者
    3     public void add(Observer observer);
    4     //移除观察者
    5     public void remove(Observer observer);
    6     //通知所有观察者
    7     public void notifyObservers();
    8 }

    b、Observer抽象接口

    1 interface Observer {
    2     public abstract void update();//更新方法
    3 }

    c、ConcreateSubject实现类

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 public class ConcreateSubject implements Subject{
     5     private String subjectState;//具体被观察者状态
     6     private List<Observer> observers = new ArrayList<Observer>();
     7     public String getSubjectState() {
     8         return subjectState;
     9     }
    10 
    11     public void setSubjectState(String subjectState) {
    12         this.subjectState = subjectState;
    13     }
    14 
    15     @Override
    16     public void add(Observer observer) {
    17         observers.add(observer);
    18     }
    19 
    20     @Override
    21     public void remove(Observer observer) {
    22         observers.remove(observer);
    23         
    24     }
    25 
    26     @Override
    27     public void notifyObservers() {
    28          for(Observer o : observers){
    29                o.update();
    30          }
    31     }
    32 }

    d、ConcreateObserver实现类

     1 public class ConcreateObserver implements Observer {
     2     private String name;
     3     private String observerState;
     4     private ConcreateSubject  subject;
     5     
     6     public ConcreateObserver(String name, ConcreateSubject subject) {
     7         super();
     8         this.name = name;
     9         this.subject = subject;
    10     }
    11 
    12     @Override
    13     public void update() {
    14         observerState = subject.getSubjectState();
    15         System.out.println("观察者" + name + "的新状态是" + observerState);
    16     }
    17 
    18     public ConcreateSubject getSubject() {
    19         return subject;
    20     }
    21 
    22     public void setSubject(ConcreateSubject subject) {
    23         this.subject = subject;
    24     }
    25     
    26 }

    e、Main方法

     1 public class Main {
     2     public static void main(String[] args) {
     3         ConcreateSubject s = new ConcreateSubject();
     4         s.add(new ConcreateObserver("tom", s));
     5         s.add(new ConcreateObserver("jack", s));
     6         s.add(new ConcreateObserver("fred", s));
     7         s.setSubjectState("live");
     8         s.notifyObservers();
     9     }
    10 }

    输出结果是

    1 观察者tom的新状态是live
    2 观察者jack的新状态是live
    3 观察者fred的新状态是live

    3、观察者模式 的特点                                            

    当一个对象的改变需要同时改变其他对象的时候,而且这个对象不知道具体有多少对象有待改变时,应该考虑使用观察者模式。通常被用来实现事件处理系统。

  • 相关阅读:
    html5和html4.0.1的<html>标记的区别
    javascript 在页面不刷新的情况下 其中的变量时不会被初始化的
    Spring配置项<context:annotation-config/>解释说明
    阿里负责人揭秘面试潜规则
    Ubuntu 软件安装、查找、卸载--apt-get、apt-cache命令安全
    Spring 中 ApplicationContext 、WebApplicationContext 和 BeanFactory 比较
    [Spring3.x] 第 15 章 Spring MVC : 第 四 篇 业务层及 web 层技术开发
    [Spring3.x] 第 11 章 使用 Spring JDBC 访问数据库 & 第 12 章 整合其他 ORM 框架
    [Spring3.x] 第 8 章 Spring 对 DAO 的支持
    [Spring3.x] 第 3 章 IOC 容器概述
  • 原文地址:https://www.cnblogs.com/fankongkong/p/7406721.html
Copyright © 2011-2022 走看看