老板出差了,员工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. Problem F: Exponentiation大数求幂

    DescriptionProblems involving the computation of exact values of very large magnitude and precision ...

  2. 一周学会Mootools 1.4中文教程:(6)动画

    先看一下动画的参数设置: 参数: fps - (number:默认是50) 每秒的帧数. unit - (string:默认是 false) 单位,可为 'px','em',或 '%'. link - ...

  3. [Java]编写自己的Matrix矩阵类

    用java实现一个简单的矩阵类,可以实现简单的矩阵计算功能. class Matrix 1.向量点乘 public static double dot(double[] x,double[] y) 2 ...

  4. Mysql 权限修改何时生效

    首先权限是记录在表中的,所以如果我们要修改权限只要修改表中的数据就可以了! 方法 1 grant ,revoke,set password,rename user .......等等 2 insert ...

  5. 5_Navigation Bar

    5 // // ViewController.swift // Navigation Bar // // Created by ZC on 16/1/9. // Copyright © 2016年 Z ...

  6. SSD的优势

    谈过SSD的发展历史后,现在我们来讲解下SSD相比传统HDD(机械硬盘)的优势. 相信很多读者只要有听说过SSD,必定都会听到对SSD优点的一个字总结:快! 但这一个字要如何去理解呢?很多人可能还不太 ...

  7. slave 成为master 时候执行的操作notify_master /etc/keepalived/send_master.sh

    slave:/root# cat /etc/keepalived/keepalived.conf global_defs { router_id MySQL-ha } vrrp_instance VI ...

  8. SGU 242 Student&#39;s Morning 网络流(水

    题目链接:contest=0&problem=242">点击打开链接 题意: 给定n个人,m个终点 以下n行表示每一个人能够去m个点. 每一个人仅仅能去一个点. 输出随意一个方 ...

  9. Objective-C中NSArray和NSMutableArray的基本用法

    /*---------------------NSArray---------------------------*/ //创建数组 NSArray *array1 = [NSArray arrayW ...

  10. Objective-c 数组对象

    首先我们必须知道数组的概念:数组是有序的对象集合,一般情况下,一个数组的对象都是相同类型的.数组当中也存在可变数组和不可变数组. 1. 不可变数组 (NSArray) 可变数组 NSMutable 是 ...