十一、观察者模式(Observable、Observer)
老板出差了,员工1、员工2..均放羊中。他们请求前台的秘书,当老板回来时通知自己,免得被Boss抓个现行。秘书想了想,说————嗯,这是观察者模式。
当一个对象的改变需要同时改变其它对象,而且它不知道具体有多少方法需要改变时,应该考虑使用观察者模式————摘自《大话设计模式》
Ps:本例用Java类库中的Observable和Observer实现
基本结构:
①、抽象通知者,接口
抽象的通知方法
②、通知者,继承Observable
通知方法,在该方法内条件判断setChange的执行与否,继而决定后续的notifyObservers是否执行
③、观察者,实现Observer接口
覆写的update方法,当“通知者”的notifyObservers方法执行时,update被调用
④、调用者
创建通知者A
创建观察者B
通过addObserver方法建立委托关系
调用通知方法
代码演示:文章开篇的例子
①、抽象通知者#########################################
/**
* 抽象的通知者
*/
public interface Subject {
public void setAction(String action); //设置行为
public String getAction(); //获取行为
public void inform();
}
②、通知者#########################################
/**
* 秘书,当老板回来时通知观察者
*/
public class Secretary extends Observable implements Subject{
private String action; //行为 @Override
public void inform(){
if(action!=null && !"".equals(action)){
this.setChanged();//只有当改变发生时,即setChange方法被触发时,才调用下面的通知方法notifyObservers
}
this.notifyObservers();//调用各个观察者的update方法
} @Override
public String getAction() {
return action;
} @Override
public void setAction(String action) {
this.action = action;
}
}
③、观察者#########################################
/**
* 观察者1,正在打魔兽
*/
public class Member1 implements Observer{
String name; //观察者姓名 public Member1(String name){
this.name = name;
} public void stopGame(){ //停止游戏
System.out.println(name+"请停止打魔兽,继续工作!");
} @Override
public void update(Observable o, Object arg) {
Subject sub = (Subject) o;
System.out.print(sub.getAction()+","); //得到行为
stopGame();
}
}
/**
* 观察者2,正在大声谈笑
*/
public class Member2 implements Observer{
String name; //观察者姓名 public Member2(String name){
this.name = name;
} public void stopNoise(){ //停止游戏
System.out.println(name+"请停止喧闹,继续工作!");
} @Override
public void update(Observable o, Object arg) {
Subject sub = (Subject) o;
System.out.print(sub.getAction()+","); //得到行为
stopNoise();
}
}
④、调用者#########################################
public class Test {
public static void main(String[] args) throws Exception {
Secretary s = new Secretary();
Member1 m1 = new Member1("张三"); //成员1
Member2 m2 = new Member2("李四"); //成员2
s.addObserver(m1); //成员1建立委托
s.addObserver(m2); //成员2建立委托
s.setAction("老板回来啦");
s.inform(); //通知
}
}
运行结果:
老板回来啦,李四请停止喧闹,继续工作!
老板回来啦,张三请停止打魔兽,继续工作!
十一、观察者模式(Observable、Observer)的更多相关文章
- java中观察者模式Observable和Observer
25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...
- 设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...
- 24种设计模式--观察者模式【Observer Pattern】
<孙子兵法>有云: “知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好 ...
- 观察者模式(Observer)发布、订阅模式
观察者模式定义了对象之间一对多的依赖关系,这样一来,当一个对象改变时,他的所有依赖者都会收到通知并自动更新. 模式中的角色 1.抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里 ...
- Java设计模式(20)观察者模式(Observer模式)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...
- RxJava 设计理念 观察者模式 Observable lambdas MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 观察者模式(observer行为)c#简单的例子
观察者模式(observer行为)c#简单的例子 几点:模式使观察目标和实现松耦合之间的依赖关系.通知会传播自己主动 样本:玩家击中后发生一系列变化的敌人:后发爆炸.敌人少1一个.... namesp ...
- javaScript设计模式--观察者模式(observer)
观察者模式(observer):又被称为 发布-订阅者模式或者消息机制,定义了一种依赖关系,解决了主体对象与观察者之间功能耦合. 一.这样的需求 在实现自己的需求,而添加一些功能代码,但是又不想新添加 ...
- 观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别
观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别 在翻阅资料的时候,有人把观察者(Observer)模式等同于发布(Publish)/订阅(Subscribe ...
- 设计模式 (二)——观察者模式(Observer,行为型)
1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.观察者模式(Observer Pattern)属于行为型模式,在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都 ...
随机推荐
- 一道面试题细说C++类型转换
开篇先说这道面试题: class ClassA { public: virtual ~ ClassA() { } virtual void FunctionA() { } }; class Class ...
- PHPEXCEL导入小技巧
在导入excel的时候,单元格格式和公式经常让导入不顺畅.注意phpexcel文档说明,基本上就可以很顺利的导入. 1.忽略单元格格格式,并导入xls.xlsx两种格式 $objReader = PH ...
- MySql按指定天数进行分组数据统计分析 2
上次的随笔1中写的分组方式,经分析,是从前往后进行分组,即若选择2014的数据进行统计每11天为一组的话,1的分组方式, 按照2014-01-01——2014-01-11为一组,之后每11天为一组. ...
- Cookie已经过时,细看Facebook, Google, Apple如何追踪用户
http://www.infoq.com/cn/news/2014/10/cookie-facebook-google-apple 链接地址 Cookie,有时也用其复数形式Cookies,指某些网站 ...
- .net中不能在DropDownList中选中多个项的解决方法
页面中放有多个DropDownList,点击修改时候,需要根据值来设置两个DropDownList的选中项,当值为空时则需要选中默认值. 页面报错:不能在DropDownList中选中多个项. 直接粘 ...
- Spring 装配Bean
Spring 装配Bean 装配解释: 创建应用对象之间协作关系的的行为通常称为装配(wiring),这也是依赖注入的本质 依赖注入是Spring的基础要素 一 : 使用spring装配Bean基础介 ...
- BZOJ 1037 [ZJOI2008]生日聚会Party(单调DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1037 [题目大意] 现在有n个男生,m个女生排成一行,要求不存在一个区间男女之差大于k ...
- cocos2d-x 多点触控实现缩放及相关问题的解决方法
首先,来看下代码: 声明文件: #ifndef __loading__MoreTouches__ #define __loading__MoreTouches__ #include <iostr ...
- ubuntu 12.04下安装和配置kohana 3.3.3 的方法
一.先到官网下载3.3.3版本的压缩包到/var/www/1117/目录下(提前建好1117的目录)解压 解压好的文件有(applications\modules\system\build.xml\c ...
- sae上屏蔽错误显示并查看错误日志
首先应用上线之前肯定要屏蔽错误显示的, 登录sae,点进去你的应用, 关闭之后进入日志管理当前的当前版本 在http中可以查看各个级别的日志记录了