观察者模式 Observer

最近学习了观察者模式,以前怎么也想不明白,松耦合怎么实现,两个类A,B中的方法c,d之间互相调用,必然需要通过B.d的方式,不然怎么实现功能独立?学习了观察者,哈哈,终于知道怎么就实现松耦合了。设计模式还是很有用且有趣的。

首先,你必须明白设计模式只是一种模式,并不能跨越一些东西,实现不调用B.d的方法实现B.d的功能。


简单来说,观察者模式就是:老鼠想偷东西,一但猫叫,老鼠就跑(观察模式的详细概念,请阅读最后的参考文章)。java语言本身支持观察者模式,那么就有cat.call(), mouse.run(),然后两个通过什么方式关联呢?

1.猫叫的时候,需要发出一个信号,表示,我要叫了,或者,我已经叫了。(你说这猫是不是有点白痴丫,恩,的确有点)对应方法如下:

setChanged();
notifyObservers("嗷嗷");


2.这个时候老鼠有一个固定的方法 update();就受到了信息,并且执行该方法。然后的代码或者被update调用,或者干脆直接写到run里面。


3.建立以上关联的就是 Observer 和 Observable,其中

老鼠,也就是观察者要实现 Observable接口:

public class Mickey implements Observer //这里是米奇老鼠,其实这里说“米奇”是不对的,先不管。

而这个Observer有一个update的方法,需要实现。


猫,也就是被观察的对象则要继承Observable类:

public class Cat extends Observable

继承之后,默认就有了一下重要的方法:

setChanged(); //设置改变
notifyObservers(); //通知改变

addObserver(); //通过这个方法增加一个观察者对象,让观察者和观察的对象关联起来。其实就是给被观察的对象增加一个观察者


下面看看具体的代码:

/**
 * 观察者模式学习-猫,被观察的对象
 * @author <a href="mailto:phpxiaoxin@gmail.com">phpxiaoxin</a>
 */

public class Cat extends Observable{

    public Cat(String name){
        this.name = name;
    }

    private String name;
    public void call(){
        this.setChanged();//this statement is need
        System.out.println("谁把我吵醒了!");
        this.notifyObservers("嗷嗷");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


/**
 * 哈哈米奇在此
 * @author <a href="mailto:phpxiaoxin@gmail.com">phpxiaoxin</a>
 */

public class Mickey implements Observer{

    public void update(Observable o, Object arg) {
        this.call(o, arg);
    }
    private void call(Observable o, Object arg){
        cat = (Cat) o;//这是拉过来的数据??不利于松耦合
        String msg = (String) arg;//这是推送过来的数据,便于松耦合

        System.out.println("this message comes from the Observable:" + arg);
        System.out.println("oh no,the creazy " + cat.getName() + " is calling ,i need to run.");
    }
    private Cat cat;

}


/**
 * 米奇开始捉弄猫了
 * @author <a href="mailto:phpxiaoxin@gmail.com">phpxiaoxin</a>
 */

public class MickeyPlayCat {

    public static void main(String[] args){

        Cat cat = new Cat("波斯猫");
        Mickey mickey = new Mickey();
        cat.addObserver(mickey);//这句让老鼠成为猫的观察者
        cat.call();
        System.out.println("完成观察者基本的学习");
    }
}
 




关于米奇老鼠中的推拉的注释我不确定我的理解是正确的 。关于推拉是这样的:


其实猫叫,要让老鼠知道,有两种方式,一种是猫叫的时候(之前或者之后都可以),通知一下老鼠,这就是所谓的推(pull)

而另外一种方式是:老鼠不断的主动看一下猫是否叫了,虽然猫如果真的要叫,老鼠会听见,这里你可以认为是猫的一种状态,比如说猫醒了,老鼠不断观察,看看猫是否醒,这就是拉了(push)


这两种方式各有利弊,详细分析大家可以看看下面的“观察者和被观察对象的对话”的文章。也挺好玩的。

http://dev.youkuaiyun.com/author/lin_bei/3a02cdf586ed47c1ac88a9d57c9e13f4.html


但是网上大部分例子都是说如何通知,也就是推(pull),而没有说如何去通过拉的方式。不知道我注释理解的对不对,个人估计8成是错的。知道是错的情评论指正,谢谢:)


最后回到开始的问题,他是怎么实现松耦合的?很简单,下面是来自java的 Observable对象 notifyObservers方法的具体实现,大家一看就明白了。

public void notifyObservers(Object arg) {
        Object[] arrLocal;

    synchronized (this) {
        if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
    }
 




其中((Observer)arrLocal[i]).update(this, arg);表明,在运行的时候,其实还是猫调用了老鼠的update方法。只不过他通过接口实现了老鼠和猫的松耦合。所以,设计模式不能跨越一些东西,他只是一种模式,是一种巧妙的方法。


需要说明的是其内部通过synchronized(同步)代码块的方式来加锁对象,实现同步。我也是第一此知道synchronized是什么,详细资料可以参考下面的文章:

http://hi.baidu.com/lynuhuoqubing/blog/item/a9450009517b5e87d1581bad.html


他里面的比喻很好玩,这里单独引用出来:

写道
同步就是简单的说我用的时候你不能用,大家用的要是一样的就这样!
比如说有只苹果很好吃,我拉起来咬一口,放下,你再拉起咬一口,这就同步了,要是大家一起咬,呵呵,那就结婚吧,婚礼上常能看到这个,也不怕咬着嘴,嘻嘻嘻!

 

关于观察者模式,大家还可以参考以下文章:

 

http://baike.baidu.com/view/1854779.htm 这个是用php语言举的例子,也是面向对象的,顺便学习一下php也不错

http://blog.hunan2s.com/?p=408

http://www.iteye.com/topic/249722

http://www.xue5.com/itedu/200702/91856.html

半导体功率器件IGBT工艺全流程 本文概述了功率器件IGBT(绝缘栅双极型晶体管)的关键制造流程。主要工艺包括:基板制备、离子注入(B+/P+/P+FS层)、绝缘膜形成与加工(CVD沉积及刻蚀)、沟槽刻蚀、电极形成(Emitter和Collector)等步骤。通过离子注入、化学气相沉积和物理气相沉积等半导体工艺,依次完成器件各功能层的构建,最终形成具备高功率特性的IGBT器件。该流程体现了功率半导体制造中典型的掺杂、薄膜沉积和图形化工艺技术。 阅读详情

相关推荐

DDS信号发生器设计避坑指南:从AD9834配置到巴特沃斯滤波实战

本文详细解析了基于AD9834芯片的DDS信号发生器设计中的关键技术要点与常见陷阱,涵盖时钟源选择、寄存器配置时序、巴特沃斯滤波器设计等核心内容。针对中高频段信号质量优化,提供了实用的解决方案和代码示例,帮助工程师规避设计误区,提升信号发生器的性能和稳定性。

2y3u4i5o6p的博客 782

关于Observer模式不得不说的二三事

   今天有同事问我关于Observer模式的一个问题,说观察者(Observer)为什么要依赖于主题(Subject),如下图所示:         从上图可以看出,具体的观察者对具体的主题有一个依赖, 而且从JDK本身提供的Observer接口,我们也可以看到,确实对主题(在JDK的实现中,为Observable接口)有一个依赖,如代码所示:   public interface...

Coding EveryDay 340

AGV舵轮选型实战:从核心参数到精准计算的完整指南

本文提供了一份详尽的AGV舵轮选型实战指南,强调从经验决策转向数据驱动。文章系统讲解了如何将工况需求转化为核心参数,并通过牵引力、扭矩、功率等关键计算步骤,指导工程师完成精准选型,避免因选型不当导致的运行故障与效率低下。

醉三国 495

观察者模式(Observer Pattern)案例解析

观察者模式(Observer Pattern)案例解析 案例描述: 有一个雷达负责扫描目标,一旦发现目标,就会通知攻击序列对目标进行摧毁,攻击序列中的所有武器会向目标发动攻击。 现有的武器可以加入攻击序列,也可以退出攻击序列。 雷达扮演Subject,大炮和导弹扮演Observer,大炮和导弹通过attach加入到雷达的攻击序列,一旦雷达发现目标,启动攻击序列摧毁目标。

1161

鸿蒙手机卸载内置应用 adb连接

**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。**

JJDXBT的博客 3万+

基于STM32的双串口同时工作的详细指南(含完整代码示例)

STM32是STMicroelectronics(意法半导体)公司推出的一系列基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统中。STM32系列微控制器具有高性能、低功耗和丰富的外设接口,适用于各种应用场景。USART(Universal Synchronous/Asynchronous Receiver/Transmitter)和UART(Universal Asynchronous Receiver/Transmitter)是串口通信的两种方式。

m0_57781768的博客 3805

Observer Pattern ——(观察者模式)

Observer Pattern 观察者模式定义 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 — 维基百科 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 在观察者模式中也有两个主

qq_38376634的博客 320

分析方法—temporal receptive field(TRF)

总结来说,时间感受野其实就是一个 filter!课程中的描述—.(使用时间感受野与刺激进行卷积来描述)时间感受野一般是听觉计算中使用的,在视觉中,有另一种分析叫做空间感受野(spatial receptive fields)。回归权重(Regression weights)是指在回归分析中用于估计自变量与因变量之间关系的权重或系数。回归分析是一种统计方法,用于建立自变量与因变量之间的关联模型,并通过拟合数据来估计模型中的参数。在简单线性回归中,只有一个自变量与一个因变量之间的关系被建模。

m0_51474171的博客 1603

观察者模式(observer pattern)

观察者模式: 定义了subject和observer之间的一对多依赖,当subject状态改变时,所有的observer都会收到通知。 结构图: C++实现: class Observer; class Subject { public: virtual void attach(Observer *o) = 0; virtual void det...

weixin_33721427的博客 255

RPA实战-UiPath自动化处理Outlook邮件附件全流程解析

本文详细解析了如何使用UiPath实现Outlook邮件附件的自动化处理全流程,涵盖环境配置、核心流程实现、高级功能扩展及性能优化技巧。通过RPA技术,企业可大幅提升邮件附件处理效率,减少人工操作错误,适用于财务、物流等多个场景。

weixin_33701251的博客 427

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 475

设计模式:观察者模式(Observer Pattern)

import java.util.ArrayList; import java.util.List; /** * 观察者模式。 * @author Bright Lee */ public class ObserverPattern { public static void main(String[] args) { Subject subject = new AnimalKe...

look4liming的专栏 311

AUTOSAR从入门到精通-汽车电子电气架构(EEA)

EEA(Electrical/Electronic Architecture),电子电气架构,是首先由德尔福公司提出的,集合汽车的电子电气系统原理设计、中央电器盒的设计、连接器的设计、电子电气分配系统等设计为一体的整车电子电气解决方案的概念。通过EEA的设计,可将动力总成、驱动信息、娱乐信息等车身信息转化为实际的电源分配的物理布局、信号网络、数据网络、诊断、容错、能量管理等的电子电气解决方案。

getusushu的博客 858

Observer Pattern 观察者模式

Publisher, Subject Subscriber, Observer Observer Pattern: defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated a

Geurney的专栏 722

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Observer Pattern(观察者模式)

<br />观察者模式应用比较广泛,写一个简单的示例,扩展了一下Head First上面例子的应用范围,进一步降低Observer与Subject之间的耦合度。<br />简单例子,直接给代码:<br />package test; public interface Subject { public void registerObserver(Observer observer); public void unRegisterObserver(Observer observer); publi

lmc_wy的专栏 848

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

观察者模式(Observer Pattern)

观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 案例一 天气预报需求 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度、气压和湿度的接口 测量数据更新时, 要能实时的通知给第三方 /** * 核心类 * 1. 包含最新的天气情况信息 * 2. 含有 Cur

jsxllht的博客 221

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

sincerit 观察者模式(Observer Pattern)

目标(Subject)即观察者观察的对象 观察者(Observer) 观察者模式:主要特点是对象之间是一对多的依赖关系,每当目标(subject)的状态发生改变时,其相关的观察者(observer)做出相应的行为 观察者模式:由一个Subject抽象目标类,ConcreteSubject具体目标类,Observer抽象观察者,ConcreteObserver具体观察者组成 观察者模式:是23种设计...

sincerit的博客 440

设计模式之观察者模式(Observer Pattern)

观察者模式定义 Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义对象之间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到...

程铭程铭你快成名的博客 3589

观察者模式Observer Pattern

观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体,当主体对象发生变化时,它的所有观察者都会收到通知。观察者模式也叫发布订阅模式,主要用于在关联行为之间建立一套触发机制的场景。 下面通过我们平时最常用的键盘鼠标相关的监听事件作为例子,来熟悉观察者模式。 一、首先创建Event类 public class Event { // 事件源,事件是由谁发起的,保存起来 ...

qq_37254296的博客 291

观察者模式(Observer Pattern)

一、什么是观察者模式 观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象(目标对象)的状态发生改变时,所有依赖于它的对象(观察对象)都得到通知并被自动更新。特点:被观察者和观察者一般是一对多的关系,一个被观察者对应多个观察者,当一个被观察者的状态发生改变时,被观察者通知观察者,然后可以在观察者内部进行业务逻辑的处理。 JDK 提供了 一套观察者模式的实现,在java.util包中, java.util.Observable类和java.util.Observer接口。Observa

ChineseSoftware的博客 3805

Java Observer Pattern(观察者模式)

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 关键代码:在抽象类里有一个 ArrayList 存放观察者们。 优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。 缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将...

mazaiting的博客 210

设计模式-观察者模式(Observer Pattern)

本文结合代码详细地介绍了观察者模式的概念,适用场景,优缺点、实现方式,可以帮助读者更好地理解观察者模式

YUMIAloogy的博客~ 1268

Java - 【设计模式】观察者模式(Observer Pattern)

设计模式 - 观察者模式(Observer Pattern) -> 解决问题:一个对象的状态发生改变,如何通知其他对象? 被观察对象(Subject) 观察对象(Observer) -> 注意: 互相指定,互相包含! 一:被观察对象(Subject) 1> 维护一个可变对象,该对象变化对应一个方法,该方法内部需要通知所有观察者(notifyAllObservers) private int state; public void setState(int state) {

⚡ 579

观察者模式(Observer Pattern)详解

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。观察者模式又被称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model-View)模式或源-监听器(Source-Listener)模式。观察者模式是一种强大且被广泛使用的设计模式,它允许对象之间进行松耦合的交互。通过将对象的依赖关系转换为松散耦合的观察者-主题关系,系统变得更加灵活和可维护。

yk_dflkg的博客 1939

观察者模式——Observer Pattern

观察者模式-ObserverPattern最近在学习C#中的委托和事件,发现C#中事件响应依赖于委托实现,而记得java中的事件响应,则属于观察者模式!所以就像搞明白,委托和观察者模式的联系和区别!观察者模式:**当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时, 则会自动通知它的依赖对象。观察者模式属于行为型模式。** 介绍

kanbujian 496

观察者模式-Observer Pattern

目录 模式的定义与特点 模式的结构与实现 模式的应用实例 模式的应用场景 模式的扩展 观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系, 一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发 生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察 者,而且这些观察者之间可以没有任何相互联系,可以根...

心猿意碼 4735
上一篇: 分布式版本控制工具 Mercurial 使用教程
下一篇: Google App Engine JAVA 开发环境搭建
xiaoxinphp
博客等级 码龄18年 1粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值