观察者模式的应用场景: 
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(); }
}

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

端茶
送水
做饭

  是不是清晰明了!

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. php 基础篇 php 进阶篇

    1:echo 12*3: 2  echo "Welcome" . " to imooc!";字符串连接. 3>foreach($shuzu as $key ...

  2. Java JVM 请别拿“String s=new String("z");创建了多少实例”来面试 [ 转载 ]

    Java 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧 [ 转载 ] @author RednaxelaFX 原文链 ...

  3. Computation expressions and wrapper types

    原文地址:http://fsharpforfunandprofit.com/posts/computation-expressions-wrapper-types/ 在上一篇中,我们介绍了“maybe ...

  4. ubuntu 14.04 GDAL

    autotools-dev comerr-dev hdf5-helpers icu-devtools krb5-multidev libarmadillo4 libarpack2 libblas3 l ...

  5. kettle连接Hive中数据导入导出(6)

    1.hive往外写数据 http://wiki.pentaho.com/display/BAD/Extracting+Data+from+Hive+to+Load+an+RDBMS 连接hive

  6. python学习入门第一天总结

    虽然之前自己也看过许多关于python的视频,但一直没有动力与勇气,所以未能坚持且也没有学得这么深刻,这次希望通过python自动化培训,能够彻底改变自己,通过第一天的python学习,自己学到了许多 ...

  7. C# 验证码生成(MVC和非MVC两种方式)

    /// <summary> /// 生成验证码 /// </summary> /// <param name="length">指定验证码的长度 ...

  8. input之placeholder与行高的问题

    我们实现一个输入框的视觉的时候为了保持其各种各样的兼容性: 1.鼠标要跟文字一样高度. 2.文字要居中对齐. 3.还要有placeholder 第一个目标,当实现一个高度为40像素的高度输入框时,为了 ...

  9. Jekyll: .md to .html with self defined themes..

    theme is from here $ gem install jekyll bundler ~ $ jekyll new my-awesome-site ~ $ cd my-awesome-sit ...

  10. KNN算法的补充

    文本自动分类技术是文字管理的基础.通过快速.准确的文本自动分类,可以节省大量的人力财力:提高工作效率:让用户快速获得所需资源,改善用户体验.本文着重对KNN文本分类算法进行介绍并提出改进方法. 一.相 ...