博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 || 观察者模式
阅读量:4566 次
发布时间:2019-06-08

本文共 2234 字,大约阅读时间需要 7 分钟。

  • 观察者模式的定义

观察者模式顾名思义,它是一个拥有被监听对象监听对象两个角色,当被监听对象有状态改变时,所有监听它的对象都会做出自己的响应,这就是观察者模式。在我的理解上,这和发布订阅模式也有一定的类似性。

  • 代码展示

首先,我们先来模拟一个场景,生活中的罪犯作为一个被监听的对象,而警察作为监听者可以监听罪犯。当罪犯做出犯罪行为的时候,就会触发一个更新事件,可以通知到警察做出响应(当然,现实中是被动通知的)。下面,我们可以通过代码来模拟一下这个场景。

 

我们新建一个罪犯类,继承jdk提供Observable类,用于表示这是一个被监听对象。这里的核心方法就是状态改变方法:setChanged();这个用与标明被观察类是否有状态更新,若没有状态改变,执行下面的通知方法会无效。通知方法:notifyObservers();这里内部有Vector集合存放的是所有观察者,它会调用所有观察者的update()方法。

1 package com.hill.observer; 2  3 import java.util.Observable; 4  5 /** 6  * @author HILL 7  * @version V1.0 8  * @date 2019/7/21 9  * 一个罪犯,每个罪犯都会被警察叔叔暗中观察,一旦罪犯出现做出违法犯罪的事情,10  * 就会被发现,最终被抓捕。11  **/12 public class Criminal extends Observable {13 14     public String name;15 16     public Criminal(String name) {17         this.name = name;18     }19 20     public void rob(){21         System.out.println(name+"准备进行抢劫");22         //父类Observable的方法,标记该对象已更改状态23         setChanged();24         //通知所有警察叔叔,可以进行抓捕。25         notifyObservers();26     }27 28 }

 

同样,我们新建一个警察类,利用jdk自带的Observer接口,实现这个接口的update()方法用于表示当观察的对象进行状态更新时,观察者需要执行的策略。

1 package com.hill.observer; 2  3 import java.util.Observable; 4 import java.util.Observer; 5  6 /** 7  * @author HILL 8  * @version V1.0 9  * @date 2019/7/2110  **/11 public class Police implements Observer {12 13     @Override14     public void update(Observable o, Object arg) {15         //警察叔叔察觉到了罪犯的犯罪行为,实施相应措施16         Criminal criminal = (Criminal) o;17         System.out.println("警察对"+criminal.name+"进行追捕");18     }19 }

 

最后的Demo是这样的。

1 package com.hill.observer; 2  3 import sun.plugin2.message.JavaScriptBaseMessage; 4  5 /** 6  * @author HILL 7  * @version V1.0 8  * @date 2019/7/21 9  **/10 public class ObserverDemo {11 12     public static void main(String[] args) {13         Criminal criminal1 = new Criminal("罪犯1");14         Criminal criminal2 = new Criminal("罪犯2");15         Police police = new Police();16         //罪犯被警察监视17         criminal1.addObserver(police);18         criminal2.addObserver(police);19         20         criminal1.rob();21         criminal2.rob();22 23     }24 }

 

 

  • 总结

观察者模式是一个很容易理解的概念,在实际的应用中,java的Swing变成,web开发中的listener(监听器)都用到了这个设计模式。虽然具体的实现有可能不同,但是其中有几个是不变的:

  1. 被观察者
  2. 一个或多个观察者
  3. 记录观察者的集合
  4. 通知方法和响应方法

 

转载于:https://www.cnblogs.com/hill1126/p/11234452.html

你可能感兴趣的文章
Eclipse修改已存在的SVN地址
查看>>
(转)使用 python Matplotlib 库绘图
查看>>
进程/线程切换原则
查看>>
正则表达式语法
查看>>
20165301 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Vue的简单入门
查看>>
urllib 中的异常处理
查看>>
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
查看>>
20181227 新的目标
查看>>
androidtab
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>
每日一小练——数值自乘递归解
查看>>
qq登陆错误提示
查看>>
bzoj 1192: [HNOI2006]鬼谷子的钱袋 思维 + 二进制
查看>>
没写完,没调完,咕咕咕的代码
查看>>