观察者模式的应用场景: 
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. 一行一行分析JQ源码学习笔记-03

    rquickExpr: <p>aaaa   或  #div1 rsingieTag: rmsPrefix :/-ms-/  是否是ie rdashAlpha = 转大小写   数字 (-2 ...

  2. hdu_5826_physics(物理题)

    题目链接:hdu_5826_physics 题意: 给你一些点的速度和初始位置,还有方向,这些速度和加速度满足v*a=c,然后又q个询问,问第t秒第K小的速度是多少 题解: 将物理公式转换为v与t的关 ...

  3. vs2013+opencv2.4.11+Qt5.5.1配置

    注意本教程配置环境:win7 32位 如果只配置vs2013+opencv2.4.11,参考http://jingyan.baidu.com/article/ff411625b1311a12e4823 ...

  4. 洛谷-A+B Problem-洛谷的第一个任务

    题目描述 Description 输入两个整数a,b,输出它们的和(a,b<=10^9)  输入输出格式 Input/output 输入格式:两个整数以空格分开输出格式:一个数  输入输出样例  ...

  5. 使用Idea作为go的IDE

    Idea是一款非常不错的IDE,只可惜是收费的.Idea可以使用很多的插件,当然里面就包含我们需要的go语言的插件. 1.我们打开file -> Settings -> Plugins - ...

  6. dbg调试

    一.启动停止dbg dbg:tracer(). dbg:stop(). 二.跟踪常用函数 1.跟踪进程 dbg:p(PidSpec,TraceFlags). PidSpec Pid 一个特定进程ID ...

  7. JPA 系列教程10-双向一对一关联表

    双向一对一关联表的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255 ...

  8. python多线程,多进程

    线程是公用内存,进程内存相互独立 python多线程只能是一个cpu,java可以将多个线程平均分配到其他cpu上 以核为单位,所以GIL(全局锁,保证线程安全,数据被安全读取)最小只能控制一个核,很 ...

  9. 10682 deathgod想知道的事(数论)

    10682 deathgod想知道的事 该题有题解 时间限制:1000MS  内存限制:65535K提交次数:265 通过次数:14 题型: 编程题   语言: G++;GCC Description ...

  10. java本地方法

    一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...