先发代码,有空来写内容。

observer1

  1. import java.util.Observer;
  2. import java.util.Observable;
  3.  
  4. //学生类(Student)继承Observable后变得可以被观察
  5. class Student extends Observable{
  6. //属性
  7. private String name;
  8. private boolean isSleep = false;
  9. private boolean isLate = false;
  10. //构造函数
  11. public Student(){}
  12. public Student(String name){
  13. this.name = name;
  14. }
  15. //睡觉行为
  16. public void sleep(){
  17. System.out.println(name + " is sleeping");
  18. isSleep = true;
  19. setChanged();
  20. notifyObservers();
  21.  
  22. }
  23. public String toString(){
  24. return name;
  25. }
  26. }
  27. //教师类(Teacher)实现Observer接口成为观察者
  28. class Teacher implements Observer{
  29. @Override
  30. public void update(Observable o,Object arg){
  31. System.out.println("teacher: "+o+",wakeup!wakeup!");
  32. }
  33. }
  34. //班主任类(ClassHead)实现Observer接口成为观察者
  35. class ClassHead implements Observer{
  36. @Override
  37. public void update(Observable o,Object arg){
  38. System.out.println("classHead: "+o+",cleanTheRoomAfterSchool");
  39. }
  40. }
  41. public class ObserverDemo{
  42. public static void main(String[] arguments){
  43. Student tom = new Student("Tom");
  44. tom.addObserver(new ClassHead());
  45. tom.addObserver(new Teacher());
  46.  
  47. System.out.println("有 "+tom.countObservers()+" 个观察者在观察Tom");
  48. tom.sleep();
  49.  
  50. }
  51. }

observer2

  1. import java.util.Map;
  2. import java.util.HashMap;
  3. import java.util.Observer;
  4. import java.util.Observable;
  5.  
  6. //学生类(Student)继承Observable后变得可以被观察
  7. class Student extends Observable{
  8. //属性
  9. private String name;
  10. private boolean isSleep = false;
  11. private boolean isLate = false;
  12. //构造函数
  13. public Student(){}
  14. public Student(String name){
  15. this.name = name;
  16. }
  17. //睡觉行为
  18. public void sleep(){
  19. System.out.println(name + " is sleeping");
  20. isSleep = true;
  21. setChanged();
  22. notifyObservers("sleep");
  23.  
  24. }
  25. //迟到行为
  26. public void late(){
  27. System.out.println(name + " was lated");
  28. isLate = true;
  29. setChanged();
  30. notifyObservers("late");
  31. }
  32. public String toString(){
  33. return name;
  34. }
  35. }
  36. //教师类(Teacher)实现Observer接口成为观察者
  37. class Teacher implements Observer{
  38. //参数arg作为key,该参数触发的回应作为value存储在Map中
  39. private Map<String,String> info = new HashMap<String,String>();
  40. public Teacher(){
  41. info.put("sleep",",wakeup!wakeup!");
  42. info.put("late",",come in.");
  43. }
  44. //添加键值对
  45. public boolean addSay(String k,String v){
  46. return info.put(k,v)==null?false:true;
  47. }
  48. @Override
  49. public void update(Observable o,Object arg){
  50. String say = info.get(arg);
  51. if(say == null){
  52. return;
  53. }
  54. System.out.println("teacher: "+o+say);
  55. }
  56. }
  57. //班主任类(ClassHead)实现Observer接口成为观察者
  58. class ClassHead implements Observer{
  59. private Map<String,String> info = new HashMap<String,String>();
  60. public ClassHead(){
  61. info.put("sleep",",goOutWashBaFace");
  62. info.put("late",",cleanTheRoom!");
  63. }
  64. public boolean addSay(String k,String v){
  65. return info.put(k,v)==null?false:true;
  66. }
  67. @Override
  68. public void update(Observable o,Object arg){
  69. String say = info.get(arg);
  70. if(say == null){
  71. return;
  72. }
  73. System.out.println("classHead: "+o+say);
  74. }
  75. }
  76. public class ObserverDemo{
  77. public static void main(String[] arguments){
  78. Student tom = new Student("Tom");
  79. tom.addObserver(new ClassHead());
  80. tom.addObserver(new Teacher());
  81.  
  82. System.out.println("有 "+tom.countObservers()+" 个观察者在观察Tom");
  83. tom.sleep();
  84. tom.late();
  85. }
  86. }

Observer与Obvsevable实现

  1. import java.util.List;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. //定义observer接口
  5. interface observer{
  6. public void update(observable o,Object arg);
  7. }
  8. //定义observable类
  9. class observable{
  10. //isChanged记录实例是否改变
  11. private boolean isChanged;
  12. //obsers存储观察者集合
  13. private List<observer> obsers;
  14. //构造函数初始化实例
  15. public observable(){
  16. isChanged = false;
  17. obsers = new ArrayList<observer>();
  18. }
  19. //设置是否发生变化为false
  20. protected void clearChanged(){
  21. isChanged = false;
  22. }
  23. //设置是否发生变化为true
  24. public void setChanged(){
  25. isChanged = true;
  26. }
  27. //返回对象是否发生改变
  28. public boolean hasChanged(){
  29. return isChanged;
  30. }
  31. //添加观察者
  32. public void addObserver(observer o){
  33. obsers.add(o);
  34. }
  35. //删除指定观察者
  36. public void deleteObserver(observer o){
  37. obsers.remove(o);
  38. }
  39. //清空所有观察者
  40. public void deleteObservers(){
  41. obsers.clear();
  42. }
  43. //返回观察者数量
  44. public int countObservers(){
  45. return obsers.size();
  46. }
  47.  
  48. //如果对象发生改变就通知所有观察者,然后将变化状态设置为false
  49. public void notifyObservers(){
  50. notifyObservers(new Object());
  51. }
  52. public void notifyObservers(Object arg){
  53. if(!hasChanged())
  54. return;
  55. Iterator it = obsers.iterator();
  56. while(it.hasNext()){
  57. ((observer)(it.next())).update(this,arg);
  58. }
  59. clearChanged();
  60. }
  61. }

设计模式01观察者模式(java)的更多相关文章

  1. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  2. 设计模式之第18章-观察者模式(Java实现)

    设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...

  3. 23种设计模式全解析 (java版本)

    转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...

  4. java_设计模式_观察者模式_Observer Pattern(2016-07-27)

    看了好几篇文章,最终还是觉得<Head First 设计模式>举得例子比较符合观察者模式. 观察者模式概述: 观察者模式有时被称作发布/订阅模式,它定义了一种一对多的依赖关系,让多个观察者 ...

  5. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  6. iOS设计模式(01):观察者

    iOS设计模式(01):观察者 iOS-Observer-Pattern 什么是观察者模式 什么是观察者模式?你曾经订阅过报纸吗?在订阅报纸的时候,你不用去任何地方,只需要将你的个人地址信息以及订阅信 ...

  7. Head First 设计模式之观察者模式(Observer Pattern)

    前言: 这一节开始学习观察者模式,开始讲之前会先像第一节那样通过一个应用场景来引入该模式.具体场景为:气象站提供了一个WeatherData对象,该对象可以追踪获取天气的温度.气压.湿度信息,Weat ...

  8. 从设计模式说起JAVA I/O流

    从设计模式说起JAVA I/O流 之前写过一篇I/O流的入门介绍,直到最近看了设计模式,顺带理下I/O流的设计思路. JAVA类库中的I/O类分成输入和输出两部分,通过继承,任何自InputStrea ...

  9. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

随机推荐

  1. 树莓派3B的食用方法-1(装系统 网线ssh连接)

    首先要有一个树莓派3B , 在某宝买就行, 这东西基本上找到假货都难,另外国产和英国也没什么差别,差不多哪个便宜买哪个就行. 不要买店家的套餐,一个是配的东西有些不需要,有的质量也不好. 提示:除了G ...

  2. 腾讯云下安装 nodejs + 实现 Nginx 反向代理

    本文将介绍如何给腾讯云上的 Ubuntu Server 12.04 LTS 64位主机安装 node 及 nginx,并简单配置反向代理. 笔者在整个安装过程中遇到不少麻烦(不赘述),如果你希望少踩坑 ...

  3. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  4. 迟来的Json反序列化

    源码发布 搞了一个下午,终于搞定了这个号称中国的github...以后源码直接在这里发布了(github实在用不来,英文实在太烂了) https://code.csdn.net/jy02305022/ ...

  5. Windows 2008 R2 安装sp1时未知错误的解决办法

    最近在为Windows Server 2008 R2 打sp1补丁时出现“发生未知错误”,详细信息错误:0x800f0818: google后找到解决问题步骤,参照:http://www.wikiho ...

  6. Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护

    CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...

  7. Java程序员的日常—— Arrays工具类的使用

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

  8. 偶遇this之坑

    前言 在写一个懒加载插件时,遇到一个坑,就是this的指向问题,我想这种情况大部分人都会遇到,就写下来,新手也有个参考. 事件 有些页面图片比较多,但用户还不一定会全看,这样的话,全部去加载这些图片, ...

  9. Python标准模块--import

    1 模块简介 作为一个Python初学者,你首先要学会的知识就是如何引入其它模块或者包.但是,我发现有些开发者虽然使用Python很多年,依然不了解Python引入机制的灵活性.这篇文章,我们就会研究 ...

  10. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...