观察者模式(Java实现)
import java.util.ArrayList;
import java.util.Iterator; /* 抽象观察者类 */ abstract class Observer { public abstract void update();
} /* 抽象被观察主题类 */ abstract class Subject{ private ArrayList obs_list = new ArrayList(); public void attach(Observer obs) {
obs_list.add(obs);
} public void Detach(Observer obs) {
obs_list.remove(obs);
} public void notifyObs() {
for (Iterator iter = obs_list.iterator(); iter.hasNext();) {
Observer obs = (Observer) iter.next();
obs.update();
}
}
} /* 具体观察者类 */
class ConcreteObserver extends Observer { private String obs_name;
private ConcreteSubject cc_subj; public ConcreteObserver(String obs_name, ConcreteSubject cc_subj) {
this.obs_name = obs_name;
this.cc_subj = cc_subj;
} public void update() {
if (cc_subj.getStatus() == 1) {
System.out.println("Boss come back, " + obs_name + " turn off screen!");
} else {
System.out.println("Boss go out, " + obs_name + " turn on screen!");
}
}
} /* 具体观察主题类 */
class ConcreteSubject extends Subject {
private int status; public ConcreteSubject(int status) {
this.status = status;
} public int getStatus() {
return status;
} public void setStatus(int status) { if (status != this.status) {
this.status = status;
super.notifyObs();
}
} } public class Observer_Test{ public static void main(String[] args) { ConcreteSubject cc_sub = new ConcreteSubject(0); ConcreteObserver cc_obs1 = new ConcreteObserver("E1", cc_sub);
ConcreteObserver cc_obs2 = new ConcreteObserver("E2", cc_sub);
ConcreteObserver cc_obs3 = new ConcreteObserver("E3", cc_sub);
cc_sub.attach(cc_obs1);
cc_sub.attach(cc_obs2);
cc_sub.attach(cc_obs3); cc_sub.setStatus(1); //status changed to 1
System.out.println("---------------------------------------");
cc_sub.setStatus(0); //status changed to 0 } }
result:
Boss come back, E1 turn off screen!
Boss come back, E2 turn off screen!
Boss come back, E3 turn off screen!
---------------------------------------
Boss go out, E1 turn on screen!
Boss go out, E2 turn on screen!
Boss go out, E3 turn on screen!
观察者模式(Java实现)的更多相关文章
- 设计模式之第18章-观察者模式(Java实现)
设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...
- 观察者模式--java
写在前面 钩子函数.注册函数.回调函数,他们的概念其实是一样的. 观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监 ...
- 观察者模式——java设计模式
观察者模式 定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 1.观察者模式的结构 ( ...
- 观察者模式/ java实现附代码 /
/注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: ...
- 设计模式01观察者模式(java)
先发代码,有空来写内容. observer1 import java.util.Observer; import java.util.Observable; //学生类(Student)继承Obser ...
- 观察者模式--java jdk中提供的支持
一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...
- 观察者模式 - Java 实现1(使用JDK内置的Observer模式)
使用JDK内置的观察者模式 1. 可观察者(主题) 被观察的主题继承 Observable 对象, 使用该对象的调用 notifyObservers() 或 notifyObservers(arg) ...
- 观察者模式——Java实例
一.定义 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个 ...
- ObserverPattern(观察者模式)-----Java/.Net
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式
随机推荐
- [转]C#截获本机数据包方法实例
本文向大家介绍Windows Sockets的一些关于用C#实现的原始套接字(Raw Socket)的编程,以及在此基础上实现的网络封包监视技术.同Winsock1相比,Winsock2最明显的就是支 ...
- Hadoop中map数的计算
转载▼ Hadoop中在计算一个JOB需要的map数之前首先要计算分片的大小.计算分片大小的公式是: goalSize = totalSize / mapred.map.tasks minSize = ...
- mybatis学习:mybatis注解开发一对一的查询配置
实体类: public class Account { private Integer id; private Integer uid; private Double money; private U ...
- leetcode 321 Create Max Number
leetcode 321 Create Max Number greedy的方法,由于有两个数组,我们很自然的想到从数组1中选i个数,数组2中选k-i个数,这样我们只需要遍历max(0, k-数组2长 ...
- 全景还原报错现场 | 应用实时监控 ARMS 上线用户行为回溯功能
随着前端技术日新月异迅猛发展,为了实现更好的前端性能,最大程度提高用户体验,支持单页应用的框架逐渐占领市场,如众所周知的React,Vue等等.但是在单页应用的趋势下,快速定位并解决JS错误却成为一大 ...
- Frank Dellaert Slam Speech 20190708
Georgia Institue of Tecknology 3D Models from Community Databases Spatiotemporal Reconstruction 4D C ...
- find()和find_all()的具体使用
在我们学会了BeautifulSoup库的用法后,我们就可以使用这个库对HTML进行解析,从网页中提取我们需要的内容. 在BeautifulSoup 文档里,find().find_all()两者的定 ...
- Redis数据库在ubuntu16.04下的安装
1.安装 sudo apt-get install redis-server 2.启动 sudo service redis-server start 3.查看 ps aux|grep redis 4 ...
- 使用Cmder 安装 Composer 出现 "attempt to call a nil value"
原因: 不是这个原因,也不是那个原因,而是采用了中文路径, 把comder 整个搬到其他目录就行了
- idea 创建properties配置文件
[转载]原文链接:https://blog.csdn.net/caoPengFlying/article/details/78660379 我们在j2ee当中,连接数据库的时候经常会用到propert ...