Java设计模式应用——观察者模式
告警结果产生后,可能需要发送短信,邮件,故障管理系统。这些转发操作不应当影响告警生成入库,并且类似事件可能根据不同场景,客户习惯不同,此时,使用观察者模式则可以很好的适应上述场景。
观察者模式应当包括:
1、 观察事件;
2、 观察者接口;
3、 若干观察者;
4、 观察者注册管理中心;
下面,我们使用观察者模式来开发告警短信、邮件转发功能;
1、 告警生成事件;
package com.coshaho.learn.observer; /**
*
* AlarmEvent.java Create on 2017年5月31日 下午10:59:24
*
* 类功能说明: 告警结果事件
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class AlarmEvent
{
private String alarmId; private String eventType; public AlarmEvent(String alarmId, String eventType) {
this.alarmId = alarmId;
this.eventType = eventType;
} public String getAlarmId() {
return alarmId;
} public void setAlarmId(String alarmId) {
this.alarmId = alarmId;
} public String getEventType() {
return eventType;
} public void setEventType(String eventType) {
this.eventType = eventType;
}
}
2、 告警生成观察者接口;
package com.coshaho.learn.observer; /**
*
* AlarmObserver.java Create on 2017年5月31日 下午11:22:43
*
* 类功能说明: 观察者接口
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public interface AlarmObserver
{
public void run(AlarmEvent event);
}
3、 邮件转发观察者;
package com.coshaho.learn.observer;
public class EmailSendObserver implements AlarmObserver{
public void run(AlarmEvent event) {
System.out.println("Send email success. Alarm id is " + event.getAlarmId()
+ ", operation type is " + event.getEventType());
}
}
4、 短信转发观察者;
package com.coshaho.learn.observer;
public class SMSSendObserver implements AlarmObserver{
public void run(AlarmEvent event) {
System.out.println("Send SMS success. Alarm id is " + event.getAlarmId()
+ ", operation type is " + event.getEventType());
}
}
5、 观察者注册管理中心;
package com.coshaho.learn.observer; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
*
* ObserverManager.java Create on 2017年5月31日 下午11:15:44
*
* 类功能说明: 观察者注册管理中心
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class ObserverManager
{ List<AlarmObserver> list = new ArrayList<AlarmObserver>(); public void add(AlarmObserver observer)
{
list.add(observer);
} public void remove(AlarmObserver observer)
{
list.remove(observer);
} public void notify(AlarmEvent event)
{
for(AlarmObserver observer : list)
{
poolService.execute(new ObserverThread(observer, event));
}
} private ExecutorService poolService = Executors.newFixedThreadPool(5);
public class ObserverThread implements Runnable
{
private AlarmObserver observer;
private AlarmEvent event;
public ObserverThread(AlarmObserver observer, AlarmEvent event)
{
this.observer = observer;
this.event = event;
}
public void run() {
observer.run(event);;
}
}
}
6、 测试类;
package com.coshaho.learn.observer; /**
*
* ObserverTest.java Create on 2017年5月31日 下午11:26:29
*
* 类功能说明: 测试
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class ObserverTest {
public static void main(String[] args)
{
AlarmEvent createEvent = new AlarmEvent("1", "create");
AlarmEvent updateEvent = new AlarmEvent("1", "update"); ObserverManager manager = new ObserverManager();
AlarmObserver emailObserver = new EmailSendObserver();
AlarmObserver smsObserver = new SMSSendObserver();
manager.add(emailObserver);
manager.add(smsObserver); manager.notify(createEvent);
manager.notify(updateEvent);
}
}
7、 结果。
Send email success. Alarm id is 1, operation type is create
Send SMS success. Alarm id is 1, operation type is create
Send email success. Alarm id is 1, operation type is update
Send SMS success. Alarm id is 1, operation type is update
Java设计模式应用——观察者模式的更多相关文章
- 理解java设计模式之观察者模式
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...
- java设计模式之观察者模式以及在java中作用
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...
- java设计模式02观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...
- java设计模式之观察者模式
观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...
- JAVA设计模式 之 观察者模式
简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...
- 折腾Java设计模式之观察者模式
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...
- JAVA设计模式之观察者模式 - Observer
有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...
- JAVA设计模式 之 观察者模式(JDK内置实现)
简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...
- java设计模式之观察者模式(9)
Java观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象.这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者 ...
- java设计模式:观察者模式
package Observer; public class Test { /** * client测试类别 * 观察者模式一般由四部分组成: * 1摘要观察员(教科书被称为一般"Subje ...
随机推荐
- 关于linux例行任务crontab的使用
Linux 例行性任务(也叫周期性任务)命令使用:crontab1.crontab -l 查看当前用户的任务2.crontab -e 编辑(设置)当前用户的任务,执行行不用重启crond服务.3 ...
- 【CF887E】Little Brother 二分+几何
[CF887E]Little Brother 题意:给你n个圆和一条线段,保证圆和圆.圆和线段所在直线不相交,不相切,不包含.求一个过线段两端点的圆,满足不和任何圆相交(可以相切.包含).问圆的最小半 ...
- CentOS下mysql安装
一.检查环境 # 切换root 权限 su root # 检查是否安装过mysql rpm -qa|grep mysql # 删除所有mysql yum -y remove mysql* 1.上传文件 ...
- Solr学习笔记之5、Component(组件)与Handler(处理器)学习
Solr学习笔记之5.Component(组件)与Handler(处理器)学习 一.搜索篇 拼写检查(spellCheck) 作用:用来检查用户输入的检索内容是否存在,如果不存在则给它提示出相近或相似 ...
- Google词向量word2vec的使用
""" 1.在自然语言处理中常常使用预训练的word2vec,这个预训练的词向量可以使用google的GoogleNews-vectors-negative300.bin ...
- 最长上升子序列 OpenJ_Bailian - 2757 dp模板
第一种是用以前状态更新当前状态(人人为我) 第二种是用当前状态更新以后状态(我为人人) 都是n^2代码: 对于人人为我的更新方法,可以用数据结构储存“人人”对其进行线性\二分优化. ; int a[m ...
- Hive和Sqoop测试数据
测试数据以Oracle数据库自带scott用户emp和dept表为准: 一.MySQL数据库创建的emp和dept表语法及数据: drop table if exists dept;create ta ...
- 2018/03/08 每日一学PHP 之 常量defind 和 const区别
常量defind 和 const区别 什么是常量? 如字面理解的,在脚本执行期间不可改变的的量. 定义一个常量应该注意的事项? 1:常量默认大小写敏感,错误的大小写不会被识别为常量. 2:常量只能是标 ...
- Roadblocks--poj3255(次短路)
题目链接 求次短路的问题: dist[i][0]和dist[i][1]表示从起点1到i的距离和从起点n到i的距离: 次短路要比最短路大但小于其他路: 每条路1--n的距离都可以用dist[i][0] ...
- python2.7+pyqt4实现记事本基本功能
记事本程序: # coding:utf-8 import sys from PyQt4.QtGui import QMainWindow from PyQt4.QtGui import QApplic ...