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

(1)抽象主题角色(Subject)
把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
(2)抽象观察者角色(Observer)
为所有具体的观察者定义一个抽象类或接口,在得到主题的通知时更新自己。
(3)具体主题角色(ConcreteSubject)
在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
(4)具体观察者角色(ConcreteObserver)
该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
2.代码实现
(1)抽象主题接口————Subject.java
public interface Subject {
void registerobserver(Observer o);
void unregisterobserver(Observer o);
void notifyobservers();
}
(2)抽象观察者接口————Observer.java
public interface Observer {
public void update(String msg);
}
(3)具体主题————Financial.java
import java.util.ArrayList;
/**
* Created by Zephery on 2017/5/7.
*/
public class Financial implements Subject {
private ArrayList<Observer> userList = new ArrayList<Observer>();
private String msg;
@Override
public void registerobserver(Observer o) {
if (!userList.contains(o)) {
userList.add(o);
}
}
@Override
public void unregisterobserver(Observer o) {
if (userList.contains(o)) {
userList.remove(o);
}
}
@Override
public void notifyobservers() {
for (Observer observer : userList) {
observer.update(msg);
}
}
public void distributemsg(String s) {
this.msg = s;
notifyobservers();
}
}
(4)具体观察者————user1.java和user2.java
User1
public class User1 implements Observer {
private Subject subject;
public User1(Subject subject){
this.subject=subject;
subject.registerobserver(this);
}
@Override
public void update(String msg){
System.out.println("User1 "+msg+" message");
}
}
User2
public class User2 implements Observer {
private Subject subject;
public User2(Subject subject) {
this.subject = subject;
subject.registerobserver(this);
}
@Override
public void update(String msg) {
System.out.println("User2 " + msg + " message");
}
}
(5)客户端测试类————ObserverPattern.java
public class ObserverPattern {
public static void main(String args[]){
Financial x=new Financial();
User1 y=new User1(x);
User2 z=new User2(x);
x.distributemsg("using");
}
}
结果:
User1 using message
User2 using message
观察者模式——java设计模式的更多相关文章
- java设计模式解析(1) Observer观察者模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章
原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...
- Java设计模式(十一) 享元模式
原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...
- java设计模式解析(11) Chain责任链模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...
- java设计模式(六)--观察者模式
转载:设计模式(中文-文字版) 目录: 简单目标任务实现 观察者模式介绍 观察者模式代码实现 观察者模式是JDK中使用最多的模式之一,非常有用.我们也会一并介绍一对多关系,以及松耦合(对,没错,我们说 ...
随机推荐
- POJ1064--Cable master(Binary Search)
Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The J ...
- webView自适应及缩放
WebView wv=(WebView) findViewById(R.id.webView); wv.setVisibility(WebView.VISIBLE); WebSettings ws = ...
- redis简单使用
主要参考资料:http://wiki.jikexueyuan.com/project/redis-guide/data-type.html一.redis 安装1.在官网下载安装包2.解压安装包 tar ...
- 前端开发 - HTML/CSS
概述 HTML是英文HyperText Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记). 相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...
- 在Delphi中处理word文档与数据库的互联 1
在Delphi中处理word文档与数据库的互联 ---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具.在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可 ...
- adb错误 - INSTALL_FAILED_NO_MATCHING_ABIS
#背景 换组啦,去了UC国际浏览器,被拥抱变化了.还在熟悉阶段,尝试了下adb,然后就碰到了这个INSTALL_FAILED_NO_MATCHING_ABIS的坑... #解决方法 INSTALL_F ...
- SQL SERVER 索引视图
创建: CREATE VIEW [dbo].[view_xxx] WITH SCHEMABINDING AS SELECT Table1.主键, Table1.外键 FROM Table1, Tabl ...
- Opencv4.0:遍历Mat图像空间、读取摄像头
GitHub https://github.com/gongluck/Opencv3.4-study.git #include "opencv2/opencv.hpp" using ...
- 简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析
简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析 虽然经常用 OAuth 2.0,但是原理却不曾了解,印象里觉得很简单,请求跳来跳去,今天看完相关介绍,就来捋一捋 ...
- 【javascript】您好, 您要的ECMAScript6速记套餐到了 (一)
[前言]本文“严重参考” 自阮一峰老师写的ES6文档,在此我郑重感谢他沉默无声的帮助 总结一下ES6为 javascript中的 对象/数组/函数 这JS三巨头所提供的更简洁优雅的书写方式,以及扩展的 ...