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 { //增加一 ...
随机推荐
- hbase安装版本
Hbase的安装部署,依赖HDFS,Zookeeper-3.4.5,jDK1.7以上,Hadoop-2.5.0以上
- SSL数字证书Nginx配置部署
由于小程序和Ios端的需要,公司的项目需要从原来的http协议扩展到https协议,因为项目本来就有采用nginx做了负载均衡,但是之前配置nginx的时候并没有配置关于https的内容,所以需要做这 ...
- VS的无用文件
目录:C:\ProgramData\Microsoft Visual Studio\10.0\TraceDebugging 每次调试程序都会产生30MB左右大小的Debug文件.如何禁止? Tools ...
- SpringMVC Hello(IDEA)
以前一想要学习Java相关知识的时候,就会认为.NET FrameWork的相关技术还没学个通透还夹生饭.现在感觉只会.NET有些单一,需要多掌握几种开发技术,尽管.NET还没达到精通.貌似Hello ...
- 在MAC电脑上抓取iphone数据包的方法
一.说明: 1.整个抓包操作的过程中,手机必须一直通过USB链接MAC电脑 2.手机系统要求在IOS5以上,因为使用的RVI技术在IOS5以后的系统中才有 3.抓包过程中,手机可以使用任何网络2G.3 ...
- HTML <a href >标签的target属性
规定在何处打开链接文档. _blank 在新窗口中打开被链接文档 _parent 在父框架集中打开被链接文档 _self 默认.在相同的框架中打开被链接文档 _top 在整 ...
- Angular4+路由
路由的作用就是(导航):会加载与请求路由相关联的组件,并获取特定路由的相关数据,这允许我们通过控制不同的路由,获取不同的数据,从而渲染不同的页面: 几种常见的路由配置: Angular路由器是一个可选 ...
- JS中获取session中传过来的值对象
摘录自:http://www.360doc.com/content/11/0316/13/5790498_101627263.shtml 把某一对象置于session范围内,并在JSP页面中提取ses ...
- Java读写Excel之POI超入门(转)
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.Apache POI ...
- linux的crash之hardlock排查记录
3.10.0-327的内核,crash记录如下: KERNEL: vmlinux DUMPFILE: vmcore [PARTIAL DUMP] CPUS: 48 DATE: Wed Oct 18 2 ...