观察者模式——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中使用最多的模式之一,非常有用.我们也会一并介绍一对多关系,以及松耦合(对,没错,我们说 ...
随机推荐
- mac终端的命令都失效的解决方法
step1. 在terminal里面输入: export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin&qu ...
- (线段树 区间运算求点)Flowers -- hdu -- 4325
http://acm.hdu.edu.cn/showproblem.php?pid=4325 Flowers Time Limit: 4000/2000 MS (Java/Others) Mem ...
- 20155326 2017-2018-1 《信息安全系统设计基础》课下加分项mypwd实现
20155326 2017-2018-1 <信息安全系统设计基础>课下加分项mypwd实现 pwd命令能做什么 在虚拟机中输入pwd查看其返回的是什么 通过上图得知pwd命令用来显示目录. ...
- noip第10课资料
- poj 3258 3273
poj3258 题目 (最大化最小值)(最小值最大化) 题意:牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离,现在去掉M块石头,要求去掉M块石 ...
- codeforce868c
C. Qualification Rounds time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- URL中文编码
/// <summary> /// GB2312编码 /// </summary> /// <param name=" ...
- [ 9.9 ]CF每日一题系列—— 259A黑白棋盘检查问题
http://codeforces.com/problemset/problem/259/A PS9.8日做了但是忘了发博客,所以坚持3天了呦~ 终于读懂了这个题了,心累 Describe: 给你8 ...
- bootstrap代码(一)
一般在个人博客上使用的较为频繁,用于显示代码的风格.在Bootstrap主要提供了三种代码风格:1.使用<code></code>来显示单行内联代码2.使用<pre> ...
- ASP.NET Web API 框架研究 Action方法介绍
在根据请求解析出匹配的Controller类型并创建实例后,要在该Controller类型中的众多Action方法中选择与请求匹配的那一个,并执行,然后返回响应. Action方法,其元数据,主要包括 ...