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 ...
随机推荐
- [分布式系统学习] 6.824 LEC3 GFS 笔记
Google File System 第三课的准备是阅读论文GFS.该论文是分布式系统中经典论文之一. 读完做一点小总结. GFS的feature 1. 非POXIS接口API,支持对文件和文件夹的创 ...
- [INS-20802] Oracle Net Configguration Assistant faild
Redhat/Centos 安装oracle11gR2时出现以下错误: [INS-20802] Oracle Net Configuration Assistant failed 查看对应日志文件,信 ...
- Linux CPU实时监控mpstat命令详解
简介 mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查 ...
- mysql unix domain socket and network socket, ssh key
当主机填写为localhost时mysql会采用 unix domain socket连接 当主机填写为127.0.0.1时mysql会采用tcp方式连接 这是linux套接字网络的特性,win平台不 ...
- docker daemon configuration
于 Docker的分层镜像,除了 aufs,docker还支持btrfs, devicemapper和vfs,你可以使用 -s 或 –storage-driver= 选项来指定相关的镜像存储.在Ubu ...
- 设计模式之——flyweight模式
flyweight模式,又叫做享元模式. 顾名思义,享元模式就是共享一个元素. 百度百科 解释为: 享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减 ...
- Django - 学习目录
Django 基础 web应用/http协议/web框架 Django简介 Django - 路由层(URLconf) Django - 视图层 Django - 模板层 Django - 模型层 - ...
- 洛谷P1850 换教室 [noip2016] 期望dp
正解:期望dp 解题报告: 哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星! 好那先把这题理顺了嗷qwq 首先我们看到期望就会 ...
- 前端 html input标签 disable 属性
该属性只要出现在标签中,表示禁用该控件 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- golang使用vet进行语法检查
go tool vet是你的好朋友,不要忽视它. vet是一个优雅的工具,每个Go开发者都要知道并会使用它.它会做代码静态检查发现可能的bug或者可疑的构造.vet是Go tool套件的一部分,我们会 ...