观察者模式(ObserverPattern):观察者模式又称发布-订阅(Publish/Subscribe)模式,定义了一个中一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

UML图:

Subject:

package com.cnblog.clarck;

import java.util.ArrayList;
import java.util.List; /**
* 主题/抽象通知者
*
* @author clarck
*
*/
public class Subject {
private List<Observer> observers = new ArrayList<Observer>(); /**
* 添加观察者
*
* @param observer
*/
public void attach(Observer observer) {
observers.add(observer);
} /**
* 移除观察者
*
* @param observer
*/
public void detach(Observer observer) {
observers.remove(observer);
} /**
* 通知
*/
public void notification() {
for (Observer observer : observers) {
observer.update();
}
}
}

Observer:

package com.cnblog.clarck;

/**
* 抽象观察者
*
* @author clarck
*
*/
public abstract class Observer {
public abstract void update();
}

ConcrateSubject:

package com.cnblog.clarck;

/**
* 具体主题/具体通知者
*
* @author clarck
*
*/
public class ConcrateSubject extends Subject {
private String mSubjectState; public String getSubjectState() {
return mSubjectState;
} public void setSubjectState(String mSubjectState) {
this.mSubjectState = mSubjectState;
} }

ConcrateObserver:

package com.cnblog.clarck;

/**
* 具体观察者
*
* @author clarck
*
*/
public class ConcrateObserver extends Observer {
private String mName;
private String mObserverState;
private ConcrateSubject mSubject; public ConcrateObserver(ConcrateSubject subject, String name) {
mSubject = subject;
mName = name;
} @Override
public void update() {
mObserverState = mSubject.getSubjectState();
String format = String.format("观察者%s的新状态是%s", mName, mObserverState);
System.out.println(format);
} public ConcrateSubject getmSubject() {
return mSubject;
} public void setmSubject(ConcrateSubject mSubject) {
this.mSubject = mSubject;
} }

Client:

package com.cnblog.clarck;

public class Client {
public static void main(String[] args) {
ConcrateSubject concrateSubject = new ConcrateSubject();
concrateSubject.attach(new ConcrateObserver(concrateSubject, "X"));
concrateSubject.attach(new ConcrateObserver(concrateSubject, "Y"));
concrateSubject.attach(new ConcrateObserver(concrateSubject, "Z")); concrateSubject.setSubjectState("ABC");
concrateSubject.notification();
}
}

设计模式——观察者模式(ObserverPattern)的更多相关文章

  1. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

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

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

  4. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

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

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

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

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

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

    前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...

  8. 深入浅出设计模式——观察者模式(Observer Pattern)

    模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...

  9. [Head First设计模式]山西面馆中的设计模式——观察者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...

随机推荐

  1. 使用Verilog描述RTL图

    题目要求 分别用两种方式表达此电路: 1)在一个模块中用两个过程来表达: 2)用顶层文件和例化语句的形式来表达. 给出下面RTL图的verilog描述. 1)纯过程语句描述 2)纯连续赋值语句描述 参 ...

  2. API 接口收集

    节假日 http://api.goseek.cn/ http://timor.tech/api/holiday http://www.easybots.cn/api/holiday.php?d=201 ...

  3. Caused by java.lang.IllegalStateException Not allowed to start service Intent { cmp=com.x.x.x/.x.x.xService }: app is in background uid UidRecord(一)

    Caused by java.lang.IllegalStateException Not allowed to start service Intent { cmp=com.x.x.x/.x.x.x ...

  4. Python+Selenium之HTMLTestRunner

    下载 HTMLTestRunner 模块 下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 保存路径:将下载的HTMLTestRunne ...

  5. Unity Editor Console Pro 扩展点击定位到外部工程

    链接 http://blog.csdn.net/akof1314/article/details/53232981 http://forum.china.unity3d.com/thread-2689 ...

  6. JS常用的设计模式(2)——简单工厂模式

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

  7. 简单的Extjs中的Combox选择下拉框使用

    { xtype: "combobox", editable: false, emptyText: "--请选择--", mode: 'local', store ...

  8. windows使用bat文件定时备份文件

    遇到一个需求,需要备份Access数据库,Access生成的数据都保存在xx.mdb文件中,所以考虑使用windows任务 定时执行一个备份文件的bat文件来解决这个问题. backup.bat文件代 ...

  9. Wp及Windows应用商店程序Logo生成器

    在开发wp或windows应用商店程序时,需要制作不同分辨率下的logo,往往不同分辨率下的logo仅仅是图片尺寸或图片的内边距不同,为了快速生成不同分辨率下的图片,减少工作量,于是就自己动手开发了个 ...

  10. js之变量介绍

    变量提升 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 'use strict'; function foo() { var x = 'He ...