Java设计模式——观察者模式
转载自:http://www.cnblogs.com/V1haoge/p/6513651.html
观察者接口:Observer
public interface Observer {
void update(String message, String name);
}
定义三个观察者:Bianyi1、Bianyi2、Bianyi3
/**
* 便衣警察张昊天
*/
public class Bianyi1 implements Observer {
// 定义姓名
private String bname = "张昊天"; @Override
public void update(String message, String name) {
System.out.println(bname + ":" + name + "那里有新情况:" + message);
}
} /**
* 便衣警察石破天
*/
public class Bianyi2 implements Observer {
// 定义姓名
private String bname = "石破天"; @Override
public void update(String message, String name) {
System.out.println(bname + ":" + name + "那里有新情况:" + message);
}
} /**
* 便衣警察赵日天
*/
public class Bianyi3 implements Observer {
// 定义姓名
private String bname = "赵日天"; @Override
public void update(String message, String name) {
System.out.println(bname + ":" + name + "那里有新情况:" + message);
}
}
目标接口:Target
public interface Target {
// 添加便衣观察者
void addObserver(Observer observer);
// 移除便衣观察者
void removeObserver(Observer observer);
// 通知观察者
void notice(String message);
}
定义两个嫌疑犯:XianFan1、XianFan2
/**
* 嫌犯大熊
*/
public class XianFan1 implements Target {
// 别称
private String name = "大熊";
// 定义观察者集合
private List<Observer> observerList = new ArrayList<Observer>(); // 增加观察者
@Override
public void addObserver(Observer observer) {
if (!observerList.contains(observer)) {
observerList.add(observer);
}
} // 移除观察者
@Override
public void removeObserver(Observer observer) {
if (observerList.contains(observer)) {
observerList.remove(observer);
}
} // 通知观察者
@Override
public void notice(String message) {
for (Observer observer : observerList) {
observer.update(message, name);
}
}
} /**
* 嫌犯黑狗
*/
public class XianFan2 implements Target {
// 别称
private String name = "黑狗";
// 定义观察者集合
private List<Observer> observerList = new ArrayList<Observer>(); // 增加观察者
@Override
public void addObserver(Observer observer) {
if (!observerList.contains(observer)) {
observerList.add(observer);
}
} // 移除观察者
@Override
public void removeObserver(Observer observer) {
if (observerList.contains(observer)) {
observerList.remove(observer);
}
} // 通知观察者
@Override
public void notice(String message) {
for (Observer observer : observerList) {
observer.update(message, name);
}
}
}
测试类:Clienter
public class Clienter {
public static void main(String[] args) {
// 定义两个嫌犯
Target tg1 = new XianFan1();
Target tg2 = new XianFan2();
// 定义三个观察便衣警察
Observer o1 = new Bianyi1();
Observer o2 = new Bianyi2();
Observer o3 = new Bianyi3();
// 为嫌犯增加观察便衣
tg1.addObserver(o1);
tg1.addObserver(o2);
tg2.addObserver(o1);
tg2.addObserver(o3);
// 定义嫌犯1的情况
String message1 = "又卖了一批货";
String message2 = "老大要下来视察了";
tg1.notice(message1);
tg2.notice(message2);
}
}
Java设计模式——观察者模式的更多相关文章
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 【设计模式】Java设计模式 - 观察者模式
[设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...
- JAVA 设计模式 观察者模式
用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...
- Java设计模式--观察者模式到监听器
观察者模式是对象的行为模式.又叫做发布-订阅模式.模型-视图模式.源-监听器模式. 抽象主题角色:主题角色将所有对观察者对象的引用到保存在一个集合里,每个主题都可以拥有任意数量的观察者.抽象主题提供一 ...
- Java设计模式の观察者模式(推拉模型)
目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者 ...
- Java设计模式 - 观察者模式
定义 观察者模式属于对象行为型模式. 在对象之间定义一对多的依赖,这样一来当一个对象改变状态,依赖它的对象都会收到通知并自动更新. 优点 1. 主题和观察者之间抽象耦合.无论什么对象主要实现了特定的 ...
- 我的Java设计模式-观察者模式
相信大家都有看过<喜洋洋与灰太狼>,说的是灰太狼和羊族的"斗争",而每次的结果都是灰太狼一飞冲天,伴随着一句"我还会回来的......".为灰太狼感 ...
- java设计模式-观察者模式学习
最近学习了设计模式中的观察者模式,在这里记录下学习成果. 观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到.只不过这个主体可以决定谁去观察他,以及做什么事情可以给别 ...
- Java设计模式——观察者模式(事件监听)
最近在看Tomcat和Spring的源码,在启动的时候注册了各种Listener,事件触发的时候就执行,这里就用到了设计模式中的观察者模式. 引-GUI中的事件监听 想想以前在学Java的GUI编程的 ...
- JAVA设计模式—观察者模式和Reactor反应堆模式
被观察者(主题)接口 定义主题对象接口 /**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一 ...
随机推荐
- Saving James Bond(dijk)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245 Saving James Bond Time Limit: 6000/3000 MS (Java ...
- Android源码博文集锦3
Android精选源码 android实现最简洁的标签(label/tag)选择/展示控件 懂得智能配色的ImageView,还能给自己设置多彩的阴影哦 NicePhoto-基于 Kotlin ...
- 面试(2)-java-se-HashSet和TreeSet12
Set是java中一个不包含重复元素的collection.更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素.正如其名称所暗示的, ...
- Python scrapy------分类获取美团整站数据
欢迎联系讨论:qq:1170370113 以下是我们获取美团页面的城市信息 获取到了城市信息以后我们可以进行分类保存,以便于后续能够分类获取数据 获取我们需要城市的景区的所有相关id并且进行保存 最后 ...
- Linux 安装及配置 Nginx + ftp 服务器
Nginx 安装及配置 一.Nginx 简介: Nginx("engine x") 是一款是由俄罗斯的程序设计师 Igor Sysoev 所开发高性能的 Web和 反向代理服务器, ...
- SDK是什么?什么是SDK
从 SDK导航 看到的 应该比较专业! SDK的英文全名是:software development kit,翻译成中文的意思就是"软件开发工具包" 通俗一点的理解,是指由第三方服 ...
- 7系列高速收发器总结 GTP IP核使用篇
上一篇7系列收发器博文讲解了GTP IP核的基本配置,本文继续分析如何将它使用起来.生成IP核后打开example design,先看看工程中包含的文件结构. 顶层文件下包含了gtp ip核系统顶层文 ...
- sql语句添加删除外键及其约束
--删除外键 ALTER TABLE t_base_role_module DROP CONSTRAINT fk_t_base_role_module_t_base_defined_url; --增加 ...
- winform程序压缩文件上传,服务器端asp.net mvc进行接收解压
期间编程没什么难度,唯一可能忽略导致结果失败是asp.net mvc配置 对于压缩文件大的话,需要配置mvc的最大接收量: <system.web> <httpRuntime ma ...
- Android_基础控件
目录 一.文本控件TextView 二.按钮控件Button 三.图片控件ImageView 四.输入控件EditText 一.文本控件TextView 1.布局文件 <TextView and ...