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 { //增加一 ...
随机推荐
- Codeforces Round #331 (Div. 2) _A. Wilbur and Swimming Pool
A. Wilbur and Swimming Pool time limit per test 1 second memory limit per test 256 megabytes input s ...
- XYZZY(spfa求最长路)
http://acm.hdu.edu.cn/showproblem.php?pid=1317 XYZZY Time Limit: 2000/1000 MS (Java/Others) Memor ...
- EMC题2
易安信笔试题分享:1 protected成员函数能被肿么调用2 “has-a” relationship是指的啥,答案有instance, reference, pointer等...3 int, c ...
- TCP层的分段和IP层的分片之间的关系 & MTU和MSS之间的关系 (转载)
首先说明:数据报的分段和分片确实发生,分段发生在传输层,分片发生在网络层.但是对于分段来说,这是经常发生在UDP传输层协议上的情况,对于传输层使用TCP协议的通道来说,这种事情很少发生. 1,MTU( ...
- 如何动态修改网页的标题(title)?
有时候我们需要复用一个页面,但是又希望他们拥有各自的标题,这时候就需要动态的去更改页面的title了,不然所有页面都是一个标题. 这时候就会想到使用js或jQuery去实现了. 1.js方式. 首先, ...
- IntelliJ IDEA 2017.3下载与安装
大约在2017年暑假的时候知道了IntelliJ IDEA,但是那个时候一心认为有Eclipse就足够用了,然而今天在网上冲浪的时候发现,IntelliJ IDEA是java语言开发的集成环境,这款开 ...
- tp5 $_ENV获取不到数据
$_ENV变量是取决于服务器的环境变量的,从不同的服务器上获取的$_ENV变量打印出的结果可能是不同的. php的配置文件php.ini的配置项为:variables_order = "GP ...
- bootstrap 响应式图片自适应图片大小
<img src="..." class="img-responsive center-block" > 或者 $(window).load(fun ...
- Vue.js的坑
参考网址:http://cn.vuejs.org/v2/guide/components.html 1.camelCase vs. kebab-case HTML 特性不区分大小写.当使用非字符串模版 ...
- 分享整理的免费API接口
天气接口 聚合数据: http://op.juhe.cn/onebox/weather/query 用例 官方文档 来源:weather.com 百度接口: http://api.map.baidu. ...