老板出差了,员工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)的更多相关文章

  1. java中观察者模式Observable和Observer

    25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...

  2. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  3. 24种设计模式--观察者模式【Observer Pattern】

     <孙子兵法>有云: “知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好 ...

  4. 观察者模式(Observer)发布、订阅模式

    观察者模式定义了对象之间一对多的依赖关系,这样一来,当一个对象改变时,他的所有依赖者都会收到通知并自动更新.   模式中的角色 1.抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里 ...

  5. Java设计模式(20)观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  6. RxJava 设计理念 观察者模式 Observable lambdas MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. 观察者模式(observer行为)c#简单的例子

    观察者模式(observer行为)c#简单的例子 几点:模式使观察目标和实现松耦合之间的依赖关系.通知会传播自己主动 样本:玩家击中后发生一系列变化的敌人:后发爆炸.敌人少1一个.... namesp ...

  8. javaScript设计模式--观察者模式(observer)

    观察者模式(observer):又被称为 发布-订阅者模式或者消息机制,定义了一种依赖关系,解决了主体对象与观察者之间功能耦合. 一.这样的需求 在实现自己的需求,而添加一些功能代码,但是又不想新添加 ...

  9. 观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别

    观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别 在翻阅资料的时候,有人把观察者(Observer)模式等同于发布(Publish)/订阅(Subscribe ...

  10. 设计模式 (二)——观察者模式(Observer,行为型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.观察者模式(Observer Pattern)属于行为型模式,在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都 ...

随机推荐

  1. 一道面试题细说C++类型转换

    开篇先说这道面试题: class ClassA { public: virtual ~ ClassA() { } virtual void FunctionA() { } }; class Class ...

  2. PHPEXCEL导入小技巧

    在导入excel的时候,单元格格式和公式经常让导入不顺畅.注意phpexcel文档说明,基本上就可以很顺利的导入. 1.忽略单元格格格式,并导入xls.xlsx两种格式 $objReader = PH ...

  3. MySql按指定天数进行分组数据统计分析 2

    上次的随笔1中写的分组方式,经分析,是从前往后进行分组,即若选择2014的数据进行统计每11天为一组的话,1的分组方式, 按照2014-01-01——2014-01-11为一组,之后每11天为一组. ...

  4. Cookie已经过时,细看Facebook, Google, Apple如何追踪用户

    http://www.infoq.com/cn/news/2014/10/cookie-facebook-google-apple 链接地址 Cookie,有时也用其复数形式Cookies,指某些网站 ...

  5. .net中不能在DropDownList中选中多个项的解决方法

    页面中放有多个DropDownList,点击修改时候,需要根据值来设置两个DropDownList的选中项,当值为空时则需要选中默认值. 页面报错:不能在DropDownList中选中多个项. 直接粘 ...

  6. Spring 装配Bean

    Spring 装配Bean 装配解释: 创建应用对象之间协作关系的的行为通常称为装配(wiring),这也是依赖注入的本质 依赖注入是Spring的基础要素 一 : 使用spring装配Bean基础介 ...

  7. BZOJ 1037 [ZJOI2008]生日聚会Party(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1037 [题目大意] 现在有n个男生,m个女生排成一行,要求不存在一个区间男女之差大于k ...

  8. cocos2d-x 多点触控实现缩放及相关问题的解决方法

    首先,来看下代码: 声明文件: #ifndef __loading__MoreTouches__ #define __loading__MoreTouches__ #include <iostr ...

  9. ubuntu 12.04下安装和配置kohana 3.3.3 的方法

    一.先到官网下载3.3.3版本的压缩包到/var/www/1117/目录下(提前建好1117的目录)解压 解压好的文件有(applications\modules\system\build.xml\c ...

  10. sae上屏蔽错误显示并查看错误日志

    首先应用上线之前肯定要屏蔽错误显示的, 登录sae,点进去你的应用, 关闭之后进入日志管理当前的当前版本 在http中可以查看各个级别的日志记录了