java设计模式-Observe
一、背景
class Child{
private boolean wakenUp = false; void wakeUp(){
wakenUp = true;
} public boolean isWakenUp() {
return wakenUp;
}
public void setWakenUp(boolean wakenUp) {
this.wakenUp = wakenUp;
}
} class Dad implements Runnable{
Child c; public Dad(Child c){
this.c = c;
} @Override
public void run() {
while(!c.isWakenUp()){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} feed(c);
} private void feed(Child c) {
System.out.println("feed child");
} } public class Test { public static void main(String[] args) {
Child d = new Child();
new Thread(new Dad(d)).start();
} }
上面代码运行起来是有问题的,永远等在那里,因为child永远不会醒过来;
那么,想让小孩5s之后醒过来怎么做?
二、让小孩5s之后醒
class Child implements Runnable{
private boolean wakenUp = false; void wakeUp(){
wakenUp = true;
} public boolean isWakenUp() {
return wakenUp;
}
public void setWakenUp(boolean wakenUp) {
this.wakenUp = wakenUp;
} @Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.wakeUp();
}
} class Dad implements Runnable{
Child c; public Dad(Child c){
this.c = c;
} @Override
public void run() {
while(!c.isWakenUp()){
System.out.println("child is't wake up");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} feed(c);
} private void feed(Child c) {
System.out.println("feed child");
} } public class Test { public static void main(String[] args) {
Child d = new Child();
new Thread(d).start();
new Thread(new Dad(d)).start();
} }
console:
child is't wake up
child is't wake up
child is't wake up
child is't wake up
child is't wake up
feed child
class Child implements Runnable{
private Dad d; public Child(Dad d){
this.d = d;
} void wakeUp(){
d.feed(this);
} @Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.wakeUp();
}
} class Dad{
public void feed(Child c) {
System.out.println("feed child");
}
} public class Test { public static void main(String[] args) {
Dad d = new Dad();
Child c = new Child(d);
new Thread(c).start();
} }
过5s后,console打印:feed child
class Child implements Runnable{
private Dad d;
String time;
String loc; public Child(Dad d){
this.d = d;
} void wakeUp(){
time = "晚上";
loc = "床上";
d.feed(this);
} @Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.wakeUp();
}
} class Dad{
public void feed(Child c) {
System.out.println("child wake up time :" + c.time);
System.out.println("child wake up location :" + c.loc);
System.out.println("feed child");
}
} public class Test { public static void main(String[] args) {
Dad d = new Dad();
Child c = new Child(d);
new Thread(c).start();
}
}
console:5s后打印:
child wake up time :晚上
child wake up location :床上
feed child
代码:
/**
* 醒过来的事件
*/
class WakenUpEvent{
private long time;
private String loc;
private Child source; //发生事件的源对象 public WakenUpEvent(long time, String loc, Child source) {
super();
this.time = time;
this.loc = loc;
this.source = source;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
public Child getSource() {
return source;
}
public void setSource(Child source) {
this.source = source;
}
} class Child implements Runnable{
private Dad d; public Child(Dad d){
this.d = d;
} void wakeUp(){
d.ActionToWakenUp(new WakenUpEvent(System.currentTimeMillis(), "bed", this));
} @Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.wakeUp();
}
} class Dad{
public void ActionToWakenUp(WakenUpEvent e) {
System.out.println("child wake up time " + e.getTime());
System.out.println("child wake up location " + e.getLoc());
System.out.println("feed child");
}
} public class Test { public static void main(String[] args) {
Dad d = new Dad();
Child c = new Child(d);
new Thread(c).start();
}
}
console,5s后打印:
child wake up time 1529505152384
child wake up location bed
feed child
上面的设计其实还有问题:
五、第三种设计方法
import java.util.ArrayList;
import java.util.List; public class Test {
public static void main(String[] args) {
Child c = new Child();
c.addWakenUpListener(new Dad());
c.addWakenUpListener(new GrandFather());
new Thread(c).start();
}
} /**
* 发出事件的主体
*/
class Child implements Runnable{
private List<WakenUpListener> WakenUplisteners = new ArrayList<WakenUpListener>(); public void addWakenUpListener(WakenUpListener l){
this.WakenUplisteners.add(l);
} void wakeUp(){
for(WakenUpListener listener : WakenUplisteners){
listener.ActionToWakenUp(new WakenUpEvent(System.currentTimeMillis(), "bed", this));
}
} @Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.wakeUp();
}
} //对应醒事件的监听器接口
interface WakenUpListener {
public void ActionToWakenUp(WakenUpEvent e);
} //Dad监听器
class Dad implements WakenUpListener{
public void ActionToWakenUp(WakenUpEvent e) {
System.out.println("event time: "+e.getTime() +",event location: "+e.getLoc());
System.out.println("feed child");
}
}
//GrandFather监听器
class GrandFather implements WakenUpListener{
public void ActionToWakenUp(WakenUpEvent e) {
System.out.println("event time: "+e.getTime() +",event location: "+e.getLoc());
System.out.println("hug child");
}
} /**
* 醒事件
*/
class WakenUpEvent{
private long time;
private String loc;
private Object source; //发生事件的源对象 public WakenUpEvent(long time, String loc, Object source) {
super();
this.time = time;
this.loc = loc;
this.source = source;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
public Object getSource() {
return source;
}
public void setSource(Object source) {
this.source = source;
}
}
console:
event time: 1529508249412,event location: bed
feed child
event time: 1529508249413,event location: bed
hug child
java设计模式-Observe的更多相关文章
- java设计模式- (1)单例模式
参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...
- JAVA 设计模式 桥接模式
用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- Java设计模式之行为型模式
行为型模式共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 策略模式:策略模式的决定权在用户,系统本身提供不同 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章
原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...
随机推荐
- PS学习之如何把小姐姐塞进瓶子里
准备素材 开始制作 用PS新建一个国际通用纸张大小的画布 分辨率可以调为72 改变背景色 插入图片 水平居中对齐 插入木质素材 放大 覆盖之前的素材 调整图层顺序 创建剪切蒙版 对木桩添加曲线 设置立 ...
- centos6.8 搭建zabbix被监控端
System:Centos 6.8 Zabbix-agent:3.2.1 1 安装对应版本的zabbix的yum源,官方网站中没有找到zabbix3.0支持的centos6的源,所以用的3.2 #rp ...
- hdu4336 Card Collector 容斥原理
In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...
- 免费获取pptv会员
打开上面的网址!领取会员!http://vip.pptv.com/activity/2016/licaitong http://vip.pptv.com/activity/2016/caifutong ...
- nginx实现集群高可用
大家知道NGINX作为反向代理服务器可以实现负载均衡,同时也可以作为静态文件服务器,它的特点就是并发支持大,单机可同时支持3万并发,现在很多网站都把NGINX作为网关入口来统一调度分配后端资源.但是如 ...
- HotSpot VM GC 的种类
collector种类 GC在 HotSpot VM 5.0里有四种: incremental (sometimes called train) low pause collector已被废弃,不在介 ...
- Architecture options to run a workflow engine
This week a customer called and asked (translated into my own words and shortened): “We do composite ...
- NET使用NPOI组件导出Excel-入门示例及通用方法
一.Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是as ...
- 20165308《Java程序设计》第7周学习总结
20165308<Java程序设计>第7周学习总结 教材学习内容总结 第十一章:JDBC与MySQL数据库 MySQL数据库管理系统 启动MySQL数据库服务器 MySQL客户端管理工具 ...
- Linux基础入门之vsFTP+MySQL/MariaDB认证实现虚拟用户配置详解
https://www.dwhd.org/20150603_144841.html 摘要 VSFTP可以使用系统账户或者匿名账户登录,但是出于安全的考虑,通常建议使用vsftp虚拟账户来登录ftp服务 ...