1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3.  
  4. /* 抽象观察者类 */
  5.  
  6. abstract class Observer {
  7.  
  8. public abstract void update();
  9. }
  10.  
  11. /* 抽象被观察主题类 */
  12.  
  13. abstract class Subject{
  14.  
  15. private ArrayList obs_list = new ArrayList();
  16.  
  17. public void attach(Observer obs) {
  18. obs_list.add(obs);
  19. }
  20.  
  21. public void Detach(Observer obs) {
  22. obs_list.remove(obs);
  23. }
  24.  
  25. public void notifyObs() {
  26. for (Iterator iter = obs_list.iterator(); iter.hasNext();) {
  27. Observer obs = (Observer) iter.next();
  28. obs.update();
  29. }
  30. }
  31. }
  32.  
  33. /* 具体观察者类 */
  34. class ConcreteObserver extends Observer {
  35.  
  36. private String obs_name;
  37. private ConcreteSubject cc_subj;
  38.  
  39. public ConcreteObserver(String obs_name, ConcreteSubject cc_subj) {
  40. this.obs_name = obs_name;
  41. this.cc_subj = cc_subj;
  42. }
  43.  
  44. public void update() {
  45. if (cc_subj.getStatus() == 1) {
  46. System.out.println("Boss come back, " + obs_name + " turn off screen!");
  47. } else {
  48. System.out.println("Boss go out, " + obs_name + " turn on screen!");
  49. }
  50. }
  51. }
  52.  
  53. /* 具体观察主题类 */
  54. class ConcreteSubject extends Subject {
  55. private int status;
  56.  
  57. public ConcreteSubject(int status) {
  58. this.status = status;
  59. }
  60.  
  61. public int getStatus() {
  62. return status;
  63. }
  64.  
  65. public void setStatus(int status) {
  66.  
  67. if (status != this.status) {
  68. this.status = status;
  69. super.notifyObs();
  70. }
  71. }
  72.  
  73. }
  74.  
  75. public class Observer_Test{
  76.  
  77. public static void main(String[] args) {
  78.  
  79. ConcreteSubject cc_sub = new ConcreteSubject(0);
  80.  
  81. ConcreteObserver cc_obs1 = new ConcreteObserver("E1", cc_sub);
  82. ConcreteObserver cc_obs2 = new ConcreteObserver("E2", cc_sub);
  83. ConcreteObserver cc_obs3 = new ConcreteObserver("E3", cc_sub);
  84. cc_sub.attach(cc_obs1);
  85. cc_sub.attach(cc_obs2);
  86. cc_sub.attach(cc_obs3);
  87.  
  88. cc_sub.setStatus(1); //status changed to 1
  89. System.out.println("---------------------------------------");
  90. cc_sub.setStatus(0); //status changed to 0
  91.  
  92. }
  93.  
  94. }

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. anaconda安装使用

    Conda是一个开源的包.环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换 下载:https://mirrors.tuna.tsinghua.edu.cn/a ...

  2. Linux下ps -ef和ps aux的区别及格式详解-转

    原文:https://www.linuxidc.com/Linux/2016-07/133515.htm Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux.这两个到底有什么区 ...

  3. C#绘制渐变线条

    Brush brush = , ), , ), Color.Blue, Color.White); e.Graphics.FillRectangle(brush, this.ClientRectang ...

  4. InnoDB: Error number 24 means ‘Too many open files’

    一.问题的描述 备份程序 执行前滚的时候报错.(-apply-log) InnoDB: Errornumber 24 means 'Too many open files'. InnoDB: Some ...

  5. Spinrg WebFlux中Cookie的读写

    WebFLux与WebMvc的差异 WebFlux读写Cookie不像WebMvc那么直接,最主要的原因是WebMvc是基于Servlet规范的,而WebFlux仅仅遵守的是HTTP协议.所以在使用的 ...

  6. 手写Function.bind函数

    if(!Function.prototype.bind){ Function.prototype.bind = function(oThis){ if(typeof this !=="fun ...

  7. vue项目中实现扫码功能

    项目地址:https://github.com/wkl007/vue-scan-demo.git 项目主要是做的一个扫码的功能 核心代码为 <div class="scan" ...

  8. vue之this.$route.params和this.$route.query的区别

    1.this.$route.query的使用 A.传参数: this.$router.push({          path: '/monitor',          query:{       ...

  9. Laravel Carbon获取 某个时间后N个月的时间

    $time = "2020-11-20 00:00:00"; $res = (new Carbon)->setTimeFromTimeString($time)->ad ...

  10. 微信Web开发者工具报错:net::ERR_BLOCKED_BY_CLIENT

    今天在微信调试琳德的拼团,用了挺久之后,输入什么测试地址:发现页面空白,console提示身份验证网址错误,错误类型为:net::ERR_BLOCKED_BY_CLIENT, 尝试了好多次.以为是我的 ...