观察者模式的应用场景: 
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。 
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

举个例子说明,这个例子讲述一个老大吩咐小弟做事的故事,只要老大一声令下小弟就开始工作,小弟成员可增减.根据模式定义,使用两个接口,多个实现

  1. package main.java.com.learn.observer;
  2.  
  3. /**
  4. * 干活接口,接到消息的类实现该接口干活,也就是观察者
  5. * @author garfield
  6. *
  7. */
  8. public interface Worker {
  9.  
  10. void doSomeThing();
  11.  
  12. }
  1. package main.java.com.learn.observer;
  2.  
  3. /**
  4. * 发号施令者,也就是被观察者
  5. * Created by garfield on 2016/6/13.
  6. */
  7. public interface Mandator {
  8.  
  9. void addWorker(Worker worker);
  10.  
  11. void removeWorker(Worker worker);
  12.  
  13. void notifyWorker();
  14. }
  1. package main.java.com.learn.observer.impl;
  2.  
  3. import main.java.com.learn.observer.Mandator;
  4. import main.java.com.learn.observer.Worker;
  5.  
  6. import java.util.ArrayList;
  7. import java.util.List;
  8.  
  9. /**
  10. * 实现发号施令,方法有添加和开除小弟,并通知小弟做事
  11. * Created by garfield on 2016/6/13.
  12. */
  13. public class MandatorImpl implements Mandator {
  14.  
  15. private List<Worker> workers = new ArrayList<>();
  16. @Override
  17. public void addWorker(Worker worker) {
  18. workers.add(worker);
  19. }
  20.  
  21. @Override
  22. public void removeWorker(Worker worker) {
  23. workers.remove(worker);
  24. }
  25.  
  26. @Override
  27. public void notifyWorker() {
  28. for (Worker worker : workers) {
  29. worker.doSomeThing();
  30. }
  31. }
  32. }
  1. package main.java.com.learn.observer.impl;
  2.  
  3. import main.java.com.learn.observer.Worker;
  4.  
  5. /**
  6. * 实现工作接口,各个小弟工作内容不一样
  7. * Created by garfield on 2016/6/13.
  8. */
  9. public class WorkImpl_1 implements Worker{
  10. @Override
  11. public void doSomeThing() {
  12. System.out.println("端茶");
  13. }
  14. }
  1. package main.java.com.learn.observer.impl;
  2.  
  3. import main.java.com.learn.observer.Worker;
  4.  
  5. /**
  6. * 实现工作接口,各个小弟工作内容不一样
  7. * Created by garfield on 2016/6/13.
  8. */
  9. public class WorkImpl_2 implements Worker{
  10. @Override
  11. public void doSomeThing() {
  12. System.out.println("送水");
  13. }
  14. }
  1. package main.java.com.learn.observer.impl;
  2.  
  3. import main.java.com.learn.observer.Worker;
  4.  
  5. /**
  6. * 实现工作接口,各个小弟工作内容不一样
  7. * Created by garfield on 2016/6/13.
  8. */
  9. public class WorkImpl_3 implements Worker{
  10. @Override
  11. public void doSomeThing() {
  12. System.out.println("做饭");
  13. }
  14. }

测试代码:

  1. package main.java.com.learn.observer;
  2.  
  3. import main.java.com.learn.observer.impl.MandatorImpl;
  4. import main.java.com.learn.observer.impl.WorkImpl_1;
  5. import main.java.com.learn.observer.impl.WorkImpl_2;
  6. import main.java.com.learn.observer.impl.WorkImpl_3;
  7.  
  8. /**
  9. * Created by garfield on 2016/6/13.
  10. */
  11. public class ObserverTest {
  12.  
  13. public static void main(String[] args){
  14. Mandator mandator = new MandatorImpl();
  15.  
  16. Worker worker1 = new WorkImpl_1();
  17. Worker worker2 = new WorkImpl_2();
  18. Worker worker3 = new WorkImpl_3();
  19.  
  20. mandator.addWorker(worker1);
  21. mandator.addWorker(worker2);
  22. mandator.addWorker(worker3);
  23.  
  24. mandator.notifyWorker();
  25.  
  26. }
  27. }

这样三个小弟就开始工作了.输出结果:

  1. 端茶
  2. 送水
  3. 做饭

  是不是清晰明了!

java设计模式案例详解:观察者模式的更多相关文章

  1. java设计模式案例详解:工厂模式

    1.简单工厂模式 在不考虑扩展的情况下还是很好用的,其实我们写代码也很经常用到,其主要理解在于传入不同参数则构建不同对象,只有一个工厂,如需添加产品涉及到扩展需要修改比较多的东西,不符合开闭原则,如下 ...

  2. java设计模式案例详解:代理模式

    代理模式就是用一个第三者的身份去完成工作,其实际意义跟字面意思其实是一样的,理解方式有很多,还是例子直观. 本例的实现类是实现买票功能,实际应用想要添加身份验证功能,利用代理模式添加验证步骤.上例子: ...

  3. java反射案例详解

    白首为功名.旧山松竹老,阻归程.欲将心事付瑶琴.知音少,弦断有谁听? [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * * ...

  4. Java设计模式 - 单例模式详解(扩展)

    单例模式引发相关整理 如何破坏单例模式 示例: /** * 如果破坏单例模式 * * @author sunyang * @date 2018/11/13 20:14 */ public class ...

  5. Java设计模式-单例模式详解(上)

    单例模式整理 敲了多年代码后,回头来看会别有一番滋味在心头.. 概念 单例模式是为了保证在一个jvm环境下,一个类仅有一个对象. 代码中常见的懒汉式.饿汉式,这些实现方式可以通过代码的设计来强制保证的 ...

  6. Java设计模式 - 单例模式详解(下)

    单例模式引发相关整理 关联线程安全 在多线程下,懒汉式会有一定修改.当两个线程在if(null == instance)语句阻塞的时候,可能由两个线程进入创建实例,从而返回了两个对象.对此,我们可以加 ...

  7. 【转】Java设计模式-单例模式详解

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控 ...

  8. spring的IOC,DI及案例详解

    一:spring的基本特征 Spring是一个非常活跃的开源框架:它是一个基于Core来架构多层JavaEE系统的框架,它的主要目的是简化企业开发.Spring以一种非侵入式的方式来管理你的代码,Sp ...

  9. 深入浅出 spring-data-elasticsearch - 基本案例详解(三

    『  风云说:能分享自己职位的知识的领导是个好领导. 』运行环境:JDK 7 或 8,Maven 3.0+技术栈:SpringBoot 1.5+, Spring Data Elasticsearch ...

随机推荐

  1. oracle 写入txt

    分几个步骤 1,创建输出路径,比如你要在/orcl/dir目录下输出,你就先要建立好这个路径,并在root用户下 chmod 777 /orcl/dir 2,sqlplus下以sysdba登录,执行以 ...

  2. spring ,mybatis多数据源

    同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况:   1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其 ...

  3. JavaScript的正则表达式

    1.文本框只能输入数字(不包括小数点) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpas ...

  4. Hadoop故障排除:jps 报process information unavailable

    4883 -- process information unavailable 解决办法: 进入tmp目录, cd /tmp 删除该目录下 名称为hsperfdata_{username}的文件夹 然 ...

  5. 背包类问题解答——poj3624分析

    习题网址:http://poj.org/problem?id=3624 试题分析:该类题通过限定物品总数量.总质量:并且初始化每个物品的起始质量和一个量化的性质.最后求解最值的量化性质的值是多少的问题 ...

  6. 一步一步学EF系列【6、IOC 之AutoFac】

    前言 之前的前5篇作为EF方面的基础篇,后面我们将使用MVC+EF 并且使用IOC ,Repository,UnitOfWork,DbContext来整体来学习.因为后面要用到IOC,所以本篇先单独先 ...

  7. 关于Mongdb的java的CRUD操作

    package mongodb; import java.net.UnknownHostException;import java.util.List; import com.mongodb.Basi ...

  8. 关于MTK平台SIM-ME Lock的配置方案

    针对一些运营商的锁网需求,MTK平台已经对其有很好的支持.绝大多数的海外需求可以通过直接配置相关文件来完成.这里简单描述一下配置方法,不做原理分析. 相关数据结构分析: Modem中与SML锁网配置相 ...

  9. 依赖跟踪如何工作的(How dependency tracking works)

    这一块主要是理论的讲解,本人刚接触这块不久,就不敢翻译了,请参见园子里其他人的现有文章 http://www.cnblogs.com/TomXu/archive/2011/11/22/2256820. ...

  10. InnoDB表要建议用自增列做主键

    InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子节点(leaf pages of the tre ...