Java观察者模式(Observer)
一、定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。主要应用在java的AWT事件机制。
二、角色
- 抽象主题角色(Subject):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
- 具体主题角色(RealSubject):在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
- 抽象观察者角色(Observer):为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
- 具体观察者角色(RealObserver):该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用,通常用一个子类实现。
三、代码演示
抽象观察者角色(Observer)
/**
 * 抽象观察者角色
 * @author zhangkang
 *
 */
public interface MyObserver {
	void update(String message,String subjectName);
}具体观察者角色1(RealObserver1)
/**
 * 具体观察者1
 * @author zhangkang
 *
 */
public class RealObserver1 implements MyObserver{
	private String name; 
	public RealObserver1(String name) {
		this.name = name;
	}
	@Override
	public void update(String message, String subjectName) {
		System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
	}
}具体观察者角色2(RealObserver2)
/**
 * 具体观察者2
 * @author zhangkang
 *
 */
public class RealObserver2 implements MyObserver{
	private String name;
	public RealObserver2(String name) {
		this.name = name;
	}
	@Override
	public void update(String message, String subjectName) {
		System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
	}
}
抽象主题角色(Subject)
/**
 * 抽象主题角色
 * @author zhangkang
 *
 */
public interface MySubject {
	void addObserver(MyObserver o); //添加观察者
	void deleteObserver(MyObserver o); //删除观察者
	void notifyObservers(String message); //通知所有的观察者
}具体主题角色(RealSubject)
import java.util.ArrayList;
import java.util.List;
/**
 * 具体主题
 * @author zhangkang
 *
 */
public class RealSubject implements MySubject{
	private String subjectName = "官方"; //主题名称
	private List<MyObserver> list; //集合用来保存每个观察者
	public RealSubject() {
		list = new ArrayList<MyObserver>();
	}
	@Override
	public void addObserver(MyObserver o) {
		list.add(o);
	}
	@Override
	public void deleteObserver(MyObserver o) {
		list.remove(o);
	}
	@Override
	public void notifyObservers(String message) {
		for (MyObserver myObserver : list) {
			myObserver.update(message, subjectName);
		}
	}
}客户端测试
/**
 * 客户端测试
 * @author zhangkang
 *
 */
public class Test {
	public static void main(String[] args) {
		//定义两个观察者
		MyObserver o1 = new RealObserver1("段友1");
		MyObserver o2 = new RealObserver2("段友2");
		//定义一个主题
		MySubject subject = new RealSubject();
		//添加观察者
		subject.addObserver(o1);
		subject.addObserver(o2);
		//发布消息通知观察者
		subject.notifyObservers("内涵段子TV已下架!");
	}
}
输出:
段友1:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】
段友2:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】Java观察者模式(Observer)的更多相关文章
- java设计模式--观察者模式(Observer)
		java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ... 
- [Android&Java]浅谈设计模式-代码篇:观察者模式Observer
		观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个 ... 
- Java 设计模式系列(十五)观察者模式(Observer)
		Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ... 
- 设计模式 - 观察者模式(Observer Pattern) Java内置 用法
		观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ... 
- java: 观察者模式:Observable被观察者,Observer观察者
		java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ... 
- 《JAVA设计模式》之观察者模式(Observer)
		在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Mo ... 
- Java观察者模式(Observer模式)
		Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ... 
- java观察者模式
		像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ... 
- C# ~ 从 委托事件 到 观察者模式 - Observer
		委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ... 
随机推荐
- (转)sudo配置文件/etc/sudoers详解及实战用法
			sudo配置文件/etc/sudoers详解及实战用法 原文:http://blog.csdn.net/field_yang/article/details/51547804 一.sudo执行命令的流 ... 
- Java命令行实用工具jps和jstat   专题
			在Linux或其他UNIX和类UNIX环境下,ps命令想必大家都不陌生,我相信也有不少同学写过 ps aux | grep java | grep -v grep | awk '{print $2}' ... 
- Kendo MVVM 数据绑定(六) Html
			Kendo MVVM 数据绑定(六) Html Html 绑定可以使用 ViewMod e 的属性来设置 DOM 元素的 innerHTML 属性.如果 ViewModel 的属性的数据类型不是字符串 ... 
- Java连接数据库,增删改查
			底层代码: package com.zdsoft; import java.sql.*; /** * Created by lx on 2017/6/22. */ public class JDBCU ... 
- bug {was not declared in this scope}
			使用自己定义的结构体作为返回值的时候,出现了 ...was not declared in this scope 检查了各种头文件,把缓存也都删掉了还是不行. 结果,发现,应该这样用vector< ... 
- pm2-web监控
			pm2-web 是一款 pm2 服务状态监控程序,基于 web . 安装 npm install -g pm2-web 运行(默认占用8080端口) pm2-web 自定义配置文件 通过 --conf ... 
- CF Gym 100637G 	\#TheDress (水)
			题解:读懂题意按照题意模拟... 熟悉了一个库函数,strstr,memcpy #include<cstdio> #include<cstring> int main() { ... 
- UVA 211 The Domino Effect 多米诺效应 (回溯)
			骨牌无非两种放法,横着或竖着放,每次检查最r,c最小的没访问过的点即可.如果不能放就回溯. 最外面加一层认为已经访问过的位置,方便判断. #include<bits/stdc++.h> ; ... 
- TextView中使用Linkify添加超链接
			首先,在TextView所属xml配置文件中,直接添加android:autoLink特性即可,它支持一个或多个(用分割线)自定义的值:none.web.email.phone或all. 另外, ... 
- opencv中mat矩阵如何debug
			mat img 看type:img.type() rows:img.rows cols:img.cols channels:img.channels(),channels()这是一个函数,和上面两个有 ... 
