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

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

package main.java.com.learn.observer;

/**
* 干活接口,接到消息的类实现该接口干活,也就是观察者
* @author garfield
*
*/
public interface Worker { void doSomeThing(); }
package main.java.com.learn.observer;

/**
* 发号施令者,也就是被观察者
* Created by garfield on 2016/6/13.
*/
public interface Mandator { void addWorker(Worker worker); void removeWorker(Worker worker); void notifyWorker();
}
package main.java.com.learn.observer.impl;

import main.java.com.learn.observer.Mandator;
import main.java.com.learn.observer.Worker; import java.util.ArrayList;
import java.util.List; /**
* 实现发号施令,方法有添加和开除小弟,并通知小弟做事
* Created by garfield on 2016/6/13.
*/
public class MandatorImpl implements Mandator { private List<Worker> workers = new ArrayList<>();
@Override
public void addWorker(Worker worker) {
workers.add(worker);
} @Override
public void removeWorker(Worker worker) {
workers.remove(worker);
} @Override
public void notifyWorker() {
for (Worker worker : workers) {
worker.doSomeThing();
}
}
}
package main.java.com.learn.observer.impl;

import main.java.com.learn.observer.Worker;

/**
* 实现工作接口,各个小弟工作内容不一样
* Created by garfield on 2016/6/13.
*/
public class WorkImpl_1 implements Worker{
@Override
public void doSomeThing() {
System.out.println("端茶");
}
}
package main.java.com.learn.observer.impl;

import main.java.com.learn.observer.Worker;

/**
* 实现工作接口,各个小弟工作内容不一样
* Created by garfield on 2016/6/13.
*/
public class WorkImpl_2 implements Worker{
@Override
public void doSomeThing() {
System.out.println("送水");
}
}
package main.java.com.learn.observer.impl;

import main.java.com.learn.observer.Worker;

/**
* 实现工作接口,各个小弟工作内容不一样
* Created by garfield on 2016/6/13.
*/
public class WorkImpl_3 implements Worker{
@Override
public void doSomeThing() {
System.out.println("做饭");
}
}

测试代码:

package main.java.com.learn.observer;

import main.java.com.learn.observer.impl.MandatorImpl;
import main.java.com.learn.observer.impl.WorkImpl_1;
import main.java.com.learn.observer.impl.WorkImpl_2;
import main.java.com.learn.observer.impl.WorkImpl_3; /**
* Created by garfield on 2016/6/13.
*/
public class ObserverTest { public static void main(String[] args){
Mandator mandator = new MandatorImpl(); Worker worker1 = new WorkImpl_1();
Worker worker2 = new WorkImpl_2();
Worker worker3 = new WorkImpl_3(); mandator.addWorker(worker1);
mandator.addWorker(worker2);
mandator.addWorker(worker3); mandator.notifyWorker(); }
}

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

端茶
送水
做饭

  是不是清晰明了!

最新文章

  1. k-means聚类算法python实现
  2. sqoop的使用
  3. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
  4. 《Linux内核设计与实现》读书笔记(十三)- 虚拟文件系统
  5. javaWEB中的HttpServlet(企业开发使用)
  6. 如何生成excel文件作为图像识别结果
  7. ion-nav-view的学习 和理解
  8. 对adapter的封装优化
  9. Java代理详解
  10. PHP合并两张图片(水印)
  11. Shell脚本数据备份
  12. tensorflow 学习日志
  13. DRDS分布式SQL引擎—执行计划介绍
  14. python timeit模块用法
  15. Luogu P2148 [SDOI2009]E&amp;D
  16. 第26月第7天 mac如何matplotlib中文乱码问题
  17. Js — CommonUtil
  18. Mysql学习第二天
  19. Python str() 函数
  20. Percona XtraDB Cluster 5.7

热门文章

  1. HDU3791二叉搜索树(二叉树)
  2. JavaScript的内置对象(Date日期+string字符串)基础语法总结
  3. CABasicAnimation 几种停止的回调
  4. shell脚本学习(四)
  5. 面试中有关C++的若干问题
  6. c++的函数模板和类模板
  7. [ An Ac a Day ^_^ ] CodeForces 339A Helpful Maths
  8. There was a problem parsing the package(android)
  9. mysql备份并自动压缩命令
  10. csdn如何转载别人的文章