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实现)的更多相关文章

  1. 设计模式之第18章-观察者模式(Java实现)

    设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...

  2. 观察者模式--java

    写在前面 钩子函数.注册函数.回调函数,他们的概念其实是一样的. 观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监 ...

  3. 观察者模式——java设计模式

    观察者模式 定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 1.观察者模式的结构 ( ...

  4. 观察者模式/ java实现附代码 /

    /注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: ...

  5. 设计模式01观察者模式(java)

    先发代码,有空来写内容. observer1 import java.util.Observer; import java.util.Observable; //学生类(Student)继承Obser ...

  6. 观察者模式--java jdk中提供的支持

    一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...

  7. 观察者模式 - Java 实现1(使用JDK内置的Observer模式)

    使用JDK内置的观察者模式 1. 可观察者(主题) 被观察的主题继承 Observable 对象, 使用该对象的调用 notifyObservers() 或 notifyObservers(arg) ...

  8. 观察者模式——Java实例

    一.定义 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个 ...

  9. ObserverPattern(观察者模式)-----Java/.Net

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式

随机推荐

  1. 技术 | TypeScript

    技术 | TypeScript   第一次接触TypeScript还是和一帮兄弟在居民楼里撸每日优鲜App的时候,没有想过那么多,只想可以快速实现和快速落地,于是我们选择ionic这个Hybrid框架 ...

  2. Cesium打包命令总结

    引言 Cesium实验室QQ群里有人在问Cesium的打包问题.我想干脆总结一下Cesium的打包命令特点,写篇文章,顺带庆祝一下1024程序员节.. Cesium的npm脚本有好多,其中几个和打包相 ...

  3. 一键清理系统垃圾文件bat

    历史比较久远了,可做一定参考. @echo off echo 正在清理系统垃圾文件,请稍等...... del /f /s /q %systemdrive%*.tmp del /f /s /q %sy ...

  4. 抽象工厂模式(Abstract Factory)(抽象化)

    不管是简单工厂模式还是工厂方法模式,在整个模式中只能有一个抽象产品,但在现实生活中,一个工厂只创建单个产品的例子很少,因为现在的工厂都是多元化发展. (1)产品等级结构:即产品的继承结构,如一个抽象类 ...

  5. CImage 是基于GDI+的,很老的一篇文章,我很久很久以前看到过的

    在许多资料上都说CImage类是基于GDI+的,但是为什么是基于GDI+的呢? 因为使用这个类时,并没有加入#include <gdiplus.h> ,也没有在程序开始和结束时分别写GDI ...

  6. Vue. 之 刷新当前页面,重载页面数据

    Vue. 之 刷新当前页面,重载页面数据 如下截图,点击左侧不同的数据,右侧根据左侧的KEY动态加载数据.由于右侧是同一个页面,在进行路由跳转后,不会再次刷新数据. 解决方案: 右侧的页面中 scri ...

  7. Luogu P1278 单词游戏(dfs)

    P1278 单词游戏 题意 题目描述 \(Io\)和\(Ao\)在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何 ...

  8. LOJ 6497 图

    LOJ 6497 图 题意 有图\(n\)点,每点可为黑或白,其中一些点颜色已定. 初时图无边,于每对\(i<j\),可由\(i\)向\(j\)连有向边,或不连. 称黑白相间之路径为交错路径. ...

  9. php 5.3 iis php_memcache 安装不上

    有的服务器很扯淡,安装了很长时间的php_memcache 扩展 始终安装不上 具体原因不清楚 因为 php_memcache.dll php 官网上只有 最新支持的版本 例如 http://pecl ...

  10. c#还有一点不太明白,既然开启了线程为何还要委托呢?

    2013-07-15 09:33threadroc | 浏览 1611 次 既然开启了线程为何还要委托呢?,开启线程本身不就是委托吗?为何委托要显示声明呢?Thread thread = new Th ...