转载自: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设计模式——观察者模式的更多相关文章

  1. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  2. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  3. JAVA 设计模式 观察者模式

    用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...

  4. Java设计模式--观察者模式到监听器

    观察者模式是对象的行为模式.又叫做发布-订阅模式.模型-视图模式.源-监听器模式. 抽象主题角色:主题角色将所有对观察者对象的引用到保存在一个集合里,每个主题都可以拥有任意数量的观察者.抽象主题提供一 ...

  5. Java设计模式の观察者模式(推拉模型)

    目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者 ...

  6. Java设计模式 - 观察者模式

    定义 观察者模式属于对象行为型模式. 在对象之间定义一对多的依赖,这样一来当一个对象改变状态,依赖它的对象都会收到通知并自动更新. 优点 1.  主题和观察者之间抽象耦合.无论什么对象主要实现了特定的 ...

  7. 我的Java设计模式-观察者模式

    相信大家都有看过<喜洋洋与灰太狼>,说的是灰太狼和羊族的"斗争",而每次的结果都是灰太狼一飞冲天,伴随着一句"我还会回来的......".为灰太狼感 ...

  8. java设计模式-观察者模式学习

    最近学习了设计模式中的观察者模式,在这里记录下学习成果. 观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到.只不过这个主体可以决定谁去观察他,以及做什么事情可以给别 ...

  9. Java设计模式——观察者模式(事件监听)

    最近在看Tomcat和Spring的源码,在启动的时候注册了各种Listener,事件触发的时候就执行,这里就用到了设计模式中的观察者模式. 引-GUI中的事件监听 想想以前在学Java的GUI编程的 ...

  10. JAVA设计模式—观察者模式和Reactor反应堆模式

    被观察者(主题)接口 定义主题对象接口 /**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一 ...

随机推荐

  1. NopCommerce用core重写ef

    最近看了NopCommerce源码,用core学习着写了一个项目,修改的地方记录下.项目地址 NopCommerce框架出来好久了.18年的第一季度 懒加载出来后也会全部移动到.net core.那么 ...

  2. Union用法及说明:

    Union是用户合并多个select结果集的操作符,需要注意的是:select语句需要有相同的列数,类似的数据类型,且列的顺序相同,另外,UNION 结果集中的列名总是等于 UNION 中第一个 SE ...

  3. 使用vue框架运行npm run dev 时报错解决

    使用使用vue框架运行npm run dev 时报错 如下: 原因: localhost:8080 有可能其他软件占用了,导致其他问题的出现 我们可以动态修改地址 解决: 进入项目文件的config文 ...

  4. MyBatis之基于XML的动态SQL

    先说下我的梦想,大学的时候一直想着是能开店卖胡辣汤,到目前依然还是我的梦想,上周一家出版社联系我问我有没有时间可以合作出书,这也是我的梦想之一,想了想还是放弃了,至少觉得目前不行,毕竟工作还不到五年, ...

  5. 【开发技术】 B/S、C/S的区别

    c/s     客户端----服务器端             可以用譬如vb或vc等语言开发,比如最常用的oicq就是.   需要在客户端安装软件. b/s     浏览器端----服务器端     ...

  6. Python3基础知识之元组、集合、字典

    1.元组 元组特点元组是不可变的两个元组可以做加法,不能做减法 元组的方法 >>> S('a', 'b', 'c', 'd', 'e')>>> S=('a','b' ...

  7. 解决 PHPExcel 长数字串显示为科学计数[转]

    解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...

  8. python3 第二十二章 - 函数式编程之Decorator(装饰器)

    前面我们说了,在python中,一切皆对象.函数也是一个对象,而且函数对象可以被赋值给变量,通过变量也能调用该函数.如: def sayHello(name): print(name + ' hell ...

  9. JavaScript var的作用域和提升

    在ES6标准之前,var 作为唯一的声明变量关键字,本篇将着重介绍var的作用域和变量提升. 1. var Hoisting(变量提升) va rHoisting:使用var在函数或全局内任何地方声明 ...

  10. linux_inode 和 block

    linux里一切皆文件 什么是文件属性? 文件本身带有的信息, 包括:索引节点编号. 文件类型以及权限.硬链接个数(备份作用).所有者.所属组.文件大小.修改月.修改日.时分 什么是索引节点? ino ...