最近学习了设计模式中的观察者模式,在这里记录下学习成果。

观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到。只不过这个主体可以决定谁去观察他,以及做什么事情可以给别人观察。

引用大师的话就是

观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

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

下面用代码展示

1.新建接口 观察者 Observer 

/**
* 观察者
* @author admin
*
*/
public interface Observer {
public void update(String newState);
}

  观察者对象非常简单,只需一个update方法,当被观察者动作时,会通知观察者,即触发update方法

2.新建抽象类 Observable

import java.util.ArrayList;
import java.util.List; public abstract class Observable {
//观察者集合
private List<Observer> observerList = new ArrayList<Observer>(); public List<Observer> getObserverList() {
return observerList;
} public void setObserverList(List<Observer> observerList) {
this.observerList = observerList;
} /**
* 添加观察者对象
* @param obs
*/
public void attach(Observer obs){
this.observerList.add(obs);
} /**
* 删除观察者对象
* @param obs
*/
public void detach(Observer obs){
this.observerList.remove(obs);
} /**
* 动作的时候通知所有观察者
*/
public void nodifyObservers(String newState){
if(null!=observerList&&observerList.size()>0){
for(Observer obs : observerList){
obs.update(newState);
}
}
} }

3.创建观察者的继承者 ObserverImpl 

/**
* 观察者的实现方法
* @author admin
*/
public class ObserverImpl implements Observer { /**
* 当被观察者出现动作时触发
*/
public void update(String newState) {
System.out.println(newState);
}
}

4.创建被观察者的子类 ObservableEx 

public class ObservableEx extends Observable {

    /**
* 当主体发生变化时,调用通知方法
* @param newState
*/
public void change(String newState){
this.nodifyObservers(newState);
} }

5.创建客户端

import org.junit.Test;

public class Client {

    /**
* 新建三个观察者,都把他们加到list中,然后调用change方法
*/
@Test
public void test(){
Observer obs1 = new ObserverImpl();
Observer obs2 = new ObserverImpl();
Observer obs3 = new ObserverImpl(); ObservableEx obse = new ObservableEx();
obse.attach(obs1);
obse.attach(obs2);
obse.attach(obs3); obse.change("i am eating");
}
}

运行后输出

参见  http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html

http://www.blogjava.net/supercrsky/articles/202544.html

java设计模式-观察者模式学习的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. Java设计模式(学习整理)---命令模式

    设计模式之Command(学习整理) 1.Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装 ...

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

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

随机推荐

  1. uC/OS-II 函数之消息队列相关函数

    上文主要介绍了信号量相关的函数,本文介绍消息队列相关的函数:OSQCreate()建立消息队列函数,OSQPend()任务等待消息函数,其他的消息函数. 消息队列介绍 消息队列是µC/OS-II中另一 ...

  2. dotnet core2常用命令

    dotnet --info 来查看是否安装成功dotnet new -alldotnet new mvc 创建MVC项目dotnet new more 查看项目类型dotnet restore (恢复 ...

  3. 3、激活层(Activiation Layers)及参数

    caffe激活层(Activiation Layers) 在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入 ...

  4. leetcode 44 字符匹配

    题意:s是空串或包含a-z字母: p为包含a-z字母或?或 * (其中*可以匹配任意字符串包括空串,?可以匹配任意字符). 思路: 1)特殊情况:当s为空串时,p为连续 * 时,则连续 * 的位置都为 ...

  5. bzoj 3261 最大异或和 可持久化字典树(01树)

    题目传送门 思路: 由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每 ...

  6. Python 3.7版本关于json.dump失效

    1.刚才写练习的时候,一直在报错,如图所示 2.度娘之后,才发现是因为我的文件名:json.py 与json.py冲突 所以该一个名字就ok了,如图所示

  7. 整理的最全 python常见面试题

      整理的最全 python常见面试题(基本必考)① ②③④⑤⑥⑦⑧⑨⑩ 1.大数据的文件读取: ① 利用生成器generator: ②迭代器进行迭代遍历:for line in file; 2.迭代 ...

  8. Java - String中的==、equals及StringBuffer(转自CSDN 作者:chenrui_)

    equals是比较值/对象是否相同,==则比较的是引用地址是否相同. ==  如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象 package com.char3; public ...

  9. (转)Http状态码301和302概念简单区别及企业应用案例

    Http状态码301和302的区别及企业应用案例 原文:http://blog.51cto.com/oldboy/1774260 1.什么是301重定向? 301重定向/跳转一般,表示本网页永久性转移 ...

  10. JS实现OO机制

    一.简单原型机制介绍 继承是OO语言的标配,基本所有的语言都有继承的功能,使用继承方便对象的一些属性和方法的共享,Javascript也从其他OO语言上借鉴了这种思想,当一个函数通过"new ...