观察者模式——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中使用最多的模式之一,非常有用.我们也会一并介绍一对多关系,以及松耦合(对,没错,我们说 ...
随机推荐
- linux 各项分布(个人记录)
1.根目录文件 root:存放root用户的相关文件home:存放普通用户的相关文件bin :存放常用命令的目录sbin:要具有一定权限才可以使用的命令mnt :挂在光驱和软盘的目录boot:存放引导 ...
- [HTML5]如何使用移动设备的方向定位器
HTML5 Rocks Show navigation Table of Contents Home Tutorials Updates Table of Contents Introduction ...
- 图解FTP服务器搭建(Windows Server 2008)
http://wenku.baidu.com/link?url=aUMoUYvSXKbHdbOHt4lUUCq0BhjnPRTM8jNb80jjwJ4_CM5LFq3lSm6f1ZlPNbFo6HEj ...
- KNIME + Python = 数据分析+报表全流程
Python 数据分析环境 数据分析领域有很多可选方案,例如SPSS傻瓜式分析工具,SAS专业性商业分析工具,R和python这类需要代码编程类的工具.个人选择是python这类,包括pandas,n ...
- 跨 iframe 传输数据
背景:项目用 easyUI 写前端,窗口使用 easyui-window 内嵌套 iframe 展示页面.遇到需要在窗口间传输数据的需求. 解决方案 获取 iframe 对象,然后通过获取的 ifra ...
- 【转载】uwp 获取系统字体库
效果图: 要获取到字体库首先要在 NuGet 添加 SharpDx.Direct2D1 api: /// <summary> /// 获取系统字体库列表 /// </summary ...
- powerviot report cannot refresh data
配置完成powerviot后发现打开excel无法刷新数据源连接提示出错: 在security token service服务应用中新建application,如图创建,然后将excel里面的auth ...
- Redis .Net
一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括 ...
- 关于SpringBoot开发微信模板推送
在这里演示一下微信的模板消息推送: 这里使用微信测试号 来演示: 先看下效果吧: 1.首先需要申请一个 微信测试号 https://mp.weixin.qq.com/wiki?t=resourc ...
- 19_python_反射
一.内置函数(补充) 1.issubclass() -- 方法用于判断参数 class 是否是类型参数 classinfo 的子类. 语法格式:issubclass(class, ...