java设计模式案例详解:观察者模式
观察者模式的应用场景:
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设计模式案例详解:观察者模式的更多相关文章
- java设计模式案例详解:工厂模式
1.简单工厂模式 在不考虑扩展的情况下还是很好用的,其实我们写代码也很经常用到,其主要理解在于传入不同参数则构建不同对象,只有一个工厂,如需添加产品涉及到扩展需要修改比较多的东西,不符合开闭原则,如下 ...
- java设计模式案例详解:代理模式
代理模式就是用一个第三者的身份去完成工作,其实际意义跟字面意思其实是一样的,理解方式有很多,还是例子直观. 本例的实现类是实现买票功能,实际应用想要添加身份验证功能,利用代理模式添加验证步骤.上例子: ...
- java反射案例详解
白首为功名.旧山松竹老,阻归程.欲将心事付瑶琴.知音少,弦断有谁听? [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * * ...
- Java设计模式 - 单例模式详解(扩展)
单例模式引发相关整理 如何破坏单例模式 示例: /** * 如果破坏单例模式 * * @author sunyang * @date 2018/11/13 20:14 */ public class ...
- Java设计模式-单例模式详解(上)
单例模式整理 敲了多年代码后,回头来看会别有一番滋味在心头.. 概念 单例模式是为了保证在一个jvm环境下,一个类仅有一个对象. 代码中常见的懒汉式.饿汉式,这些实现方式可以通过代码的设计来强制保证的 ...
- Java设计模式 - 单例模式详解(下)
单例模式引发相关整理 关联线程安全 在多线程下,懒汉式会有一定修改.当两个线程在if(null == instance)语句阻塞的时候,可能由两个线程进入创建实例,从而返回了两个对象.对此,我们可以加 ...
- 【转】Java设计模式-单例模式详解
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控 ...
- spring的IOC,DI及案例详解
一:spring的基本特征 Spring是一个非常活跃的开源框架:它是一个基于Core来架构多层JavaEE系统的框架,它的主要目的是简化企业开发.Spring以一种非侵入式的方式来管理你的代码,Sp ...
- 深入浅出 spring-data-elasticsearch - 基本案例详解(三
『 风云说:能分享自己职位的知识的领导是个好领导. 』运行环境:JDK 7 或 8,Maven 3.0+技术栈:SpringBoot 1.5+, Spring Data Elasticsearch ...
随机推荐
- Qt ImageProvider 的使用
QQuickImageProvider 是一个可以支持在QML中使用 qpixmap 和 图片加载线程的类. 它支持在qml中使用Image加载的高级特性, 包括 使用 QPixmap 替代实际的im ...
- 【LeetCode】24. Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...
- 一行一行分析JQ源码学习笔记-06
节点类型获取$("span")首先 判断 if(select.nodeType) markarray() 类数组 转化成真正的数组 var adiv = document.getE ...
- 高精度之+×÷
以下是三种高精度算术的模版: 高精度加法: ",s1,s2; ],ss2[],len; void dashu(string s1,int ss1[]) { ;i>=;i--) { ;j ...
- ERP流程图
- Excel教程(2) - 函数的参数
函数右边括号中的部分称为参数,假如一个函数可以使用 多个参数,那么参数与参数之间使用半角逗号进行分隔.参数 可以是常量(数字和文本).逻辑值(例如 TRUE 或 FALSE).数 组.错误值(例如#N ...
- 获取android源码中遇到的问题
最近项目相当紧张,回家之后还需要继续研究android源码. 从网上找了一些资料,下载过程中还是遇到了很多问题.这里罗列一下: 1. 下载Repo过程中提示证书问题: curl https://dl- ...
- 带宽 VS CDN (转载)
并发的影响因素:带宽.web server(含php).static server.数据库 带宽价格: 静态IP企业宽带 5M 10M 50M 100M 200M 盛大云 华东双线 216/月 396 ...
- asp 操作 xml
'创建DOM对象 set objDom=server.CreateObject( "MicroSoft.XMLDom ") '取得xml数据 '方法1 取得xml文件的xml数据 ...
- [NPOI2.0] 使用NPOI读取和导出Excel文件
先来说下一直使用的 Microsoft.Office.Interop.Excel ,在系统正式使用时遇到的问题 1:Excel读取数据BUG 由于使用Microsoft.Office.Interop. ...