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 ...
随机推荐
- 【LeetCode】463. Island Perimeter
You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...
- XmlNode和XmlElement区别
今天在做ASP.NET操作XML文档的过程中,发现了两个类:XmlNode和XmlElement.这两个类的功能极其类似(因为我们一般都是在对Element节点进行操作).上网搜罗了半天,千篇一律的答 ...
- Objetive-C initialize研究
initialize执行时机 在向一个类执行实例方法或者类方法(除了initialize和load方法之外)的时候,触发initialize方法,因此如果一个类你没有使用的时候,是 ...
- ESFramework ——可堪重任的网络通信框架
ESFramework是一套性能卓越.稳定可靠.强大易用的跨平台通信框架,支持应用服务器集群.其内置了消息的收发与自定义处理(支持同步/异步模型).消息广播.P2P通道.文件传送(支持断点续传).心跳 ...
- 【Loadrunner】初学Loadrunner——参数化设置(Xml类型)
不是所有类型的参数都是和XML类型,只有一段标准的XML语句块,而且需要选中整个完整的XML语句块才可以使用XML的参数化.单个变量是不适合XML的参数化的.在选择的时候需要选中XML语句块的起始标签 ...
- IE/Chrome背景图片居中1px偏移解决方法
最近在支持行业运营的一个推广页面,遇到了非常规的页面banner图居中的问题,为了解决此问题,做了简单的测试,做了一个小结,为经常做大促页面的兄弟姐妹们提供参考解决方案. 首先来看看现象.最经典的页面 ...
- 汇总jQuery的61种选择器及示例
汇总jQuery的61种选择器及示例 恋痿喃 ㄍń稀广 因罘乐睽 ú燔蒇 骤幄觳 ч豹 齑骝氮铷 宅廓Ω孓 锏遒 荛猩ㄜ彬 芡钷ж ┊贩错鹌 掩饰着可还是几步就窜到了门口看着这个让她 ...
- 【java学习】Servlet简单的表单程序(一)
此文用于java学习,在此小记. 在此小Demo中使用到了Servlet,所以有必要了解一下Servlet的相关知识.(Servlet的相关知识摘抄自http://blog.csdn.net/jiuq ...
- centos 10字母随机文件病毒清理
病毒表现:网络流量暴满,疯狂地向香港的一个IP发数据,同时在top里面表现为随机的10位字母的进程,看/proc里面的信息,则为ls,cd之类常见的命令,CPU利用率也在top之首.杀死该进程后,会再 ...
- pt-heartbeat监控延时
测试国内主机到国外主机mysql的延时 主机 perl /usr/bin/pt-heartbeat -uroot --ask-pass -D uk --create-table --update ...