观察者模式(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. 【研究】缓慢的http拒绝服务攻击

    1 详细描述: 缓慢的http拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量http request攻击,直到服务器带宽被打满,造成了拒绝服 ...

  2. PIE SDK SFIM融合

    1.算法功能简介 SFIM 融合方法全称为基于平滑滤波的亮度变换.基本原理是将高分辨率影像通过低通滤波抑制其高频空间信息保留低频信息,再将原高分辨率影像与通过低通滤波的高分辨率影像进行比值运算,以抵消 ...

  3. C#生成二維碼(ThoughtWorks.QRCode)

    本人使用的是ThoughtWorks.QRCode.dll,在網上可以下載,但要注意dll文件的完整性和準確性,本人之前下載的dll就是不正確導致調試時出現錯誤. 以下為cs文件代碼: using S ...

  4. 使用JWT来实现单点登录功能

    出处: https://www.cnblogs.com/zexin/p/10389541.html 我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不 ...

  5. C++ 17的新标准

    几个自己比较关注的C++新标准,说是17的标准,不过估计要拖到20才能真正支持   Module python的import之类的东西   解决问题: include头文件导致速度变慢的问题   目前 ...

  6. 案例48-crm练习利用spring管理service和dao层的对象

    1 导包 2 将 Service 对象以及 Dao 对象配置到 spring 容器 <?xml version="1.0" encoding="UTF-8" ...

  7. URAL 1252 ——Sorting the Tombstones——————【gcd的应用】

    Sorting the Tombstones Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I ...

  8. python 模板注入

    今天学习了python的模板注入,这里自己搭建环境测试以下,参考文章:http://www.freebuf.com/articles/web/136118.html web 程序包括两个文件: fla ...

  9. 面试题 数据库sql

    一.建表的结构和数据,在sqlserver直接用就行了 USE [test] GO /****** Object: Table [dbo].[TEACHER] Script Date: 05/16/2 ...

  10. 【linux相识相知】独立硬盘冗余阵列-RAID

    独立硬盘冗余阵列(RAID,Redundant Array of Independant Disks),旧称为廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks ...