关闭

Java 设计模式 之 观察者模式

标签: java设计模式对象
1308人阅读 评论(1) 收藏 举报
分类:

简介 :

  • 观察者模式 用于监听一些对象的状态,如果被监听的对象的数据被改变了,那么他的观察者就会知道,并且根据被修改的数据进行一些操作。

问题的引出 :

在这里拿老师与学生来举一个简单的例子

教室里的学生正在听课,教室里面的老师正在上课,窗外的的班主任正在看着教室里面的学生,这个时候教室里面学生属于被观察的对象,而正在上课的老师和班主任则属于观察者,这个时候教室的里面属于听课状态的学生的状态发生改变的话,观察者也就是老师和版主就会知道,并且做出一些措施,大致流程可以用下面这张图表示
这里写图片描述

具体代码:

首先要有一个容器能够装载观察者和通知观察者


import java.util.ArrayList;
import java.util.List;

import OBserver.Observer;

public abstract class Container {
    private List<Observed> list = new ArrayList<Observed>();

    //添加观察者
    public void addObserved(Observed observed) {
    System.out.println("观察者正在观察--->"+observed);
    list.add(observed);
    }
    //通知每个观察者
    public void  notifydata(StudentState state) {
    for (Observed observed : list) {
        observed.dosth(state);
    }
    }
    //移除观察者
    public void detach(Observer observer){
        list.remove(observer);
    }

}

然后我们需要一个观察的抽象类与具体实现类

public interface Observed {
    public void dosth(StudentState state);
}

public class ObservedTeacher implements Observed{

    @Override
    public void dosth(StudentState state) {
    //根据学生的状态  观察者(老师) 做出一些事情
    System.out.println("观察者收到状态开始根据状态做出一些事情--->" +state );

    }

}

然后我们好需要一个学生类 这个学生类需要基础container容器,这样当学生类发送变化时能够通知观察者进行更新

public class Student extends Container {
    private StudentState state = StudentState.serious;

    public void changeState(StudentState state) {
    this.state = state;
    System.out.println("当前状态--->"+this.state);
    this.notifydata(state);
    }
}   

然后定义一个enum来表达学生类的现在的类型

public enum StudentState {
    serious,diver;                                                                                                                                                                                                                                                                              
}

最后需要一个Main来对观察进行注册 和 学生类的实例化


public class Main {
    public static void main(String[] args) {
    Student student = new Student();
    Observed teacher = new ObservedTeacher();
    student.addObserved(teacher);
    student.changeState(StudentState.diver);
    }
}

最后我们看一下运行结果

观察者正在观察--->ObServerPattern.ObservedTeacher@2a139a55
当前状态--->diver
观察者收到状态开始根据状态做出一些事情--->diver

最后让我们来看一下 我写的这个观察者模式的流程图,到底是怎样运行的

这里写图片描述

最后需要注意下

  • JAVA 中已经有了对观察者模式的支持类。
  • 避免循环引用。
  • 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
1
0
查看评论

《设计模式之禅》学习小结之观察者模式,门面模式和备忘录模式

一。观察者模式
  • aid414944
  • aid414944
  • 2014-04-15 08:59
  • 663

Java设计模式-回调函数和观察者模式

Android的框架中有非常多的地方使用了回调的模式,例如Activity的生命周期,按钮的点击事件等。 下面是回调的基本模型: public class A { private CallBack callback; //注册一个事件 public void register(CallBac...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015-03-24 16:20
  • 8978

Java观察者模式以及与订阅发布者模式区别

设计模式复习,代码是最好的说明。 定义:观察者模式定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新,属于行为类模式。 注意:观察者模式和发布订阅模式是有区别的,区别在于观察者模式是由目标进行调度,而发布订阅模式是由独立的调度中心进行调度,可以说...
  • poyuan97
  • poyuan97
  • 2017-09-28 16:15
  • 118

设计模式——观察者模式(Observer)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记,欢迎交流。 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念          ...
  • u012909091
  • u012909091
  • 2014-08-20 16:52
  • 2942

Java设计模式(观察者模式JDK自带)

JDK自带的观察者模式和我们上一节说的基本相似,也有通用的观察协议规则 Observer,这个接口中只有一个方法,就是update方法 public interface Observer { void update(Observable o, Object arg); } JDK也有一个可...
  • xyjwsj
  • xyjwsj
  • 2017-02-15 16:47
  • 741

设计模式之观察者模式与事件委托

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自己更新自己。         观察者结构模式图:         &...
  • wangdan199112
  • wangdan199112
  • 2014-02-16 21:36
  • 2284

设计模式——观察者模式 Java源代码

观察者模式,本程序改编自《Head First Design Patterns》上关于气象站的例子,我将例子进行了化简。
  • u013390476
  • u013390476
  • 2015-12-29 19:30
  • 1178

设计模式--观察者模式、状态模式

【观察者模式】          多个观察者同时监听一个主题,一旦主题对象发生改变便会通知所有的观察者对象,并相应自己的更新事件!                 ...
  • u012466304
  • u012466304
  • 2014-12-09 17:40
  • 1935

大话西游之设计模式_起手篇

介绍了设计模式是什么。能干什么、及怎么运用? 通过西游记中故事的分析,将常用设计模式融合在故事的实现中,帮助大家理解&记住各种设计模式的概念及使用方法。 达到活学活用的情况~
  • myhc2014
  • myhc2014
  • 2015-10-15 10:52
  • 746

设计模式 观察者模式 以微信公众服务为例

继续设计模式的文章,今天给大家带来观察者模式。 先来看看观察者模式的定义: 定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。 好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。 看一张...
  • lmj623565791
  • lmj623565791
  • 2014-04-20 13:27
  • 19606
    个人资料
    • 访问:112182次
    • 积分:1387
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论