`

行为型模式--观察者模式(Observed)

阅读更多

。观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:

我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。我们看实现代码:

一个Observer接口:

[java] view plaincopy
  1. public interface Observer {  
  2.     public void update();  
  3. }  

两个实现类:

[java] view plaincopy
  1. public class Observer1 implements Observer {  
  2.   
  3.     @Override  
  4.     public void update() {  
  5.         System.out.println("observer1 has received!");  
  6.     }  
  7. }  
[java] view plaincopy
  1. public class Observer2 implements Observer {  
  2.   
  3.     @Override  
  4.     public void update() {  
  5.         System.out.println("observer2 has received!");  
  6.     }  
  7.   
  8. }  

Subject接口及实现类:

[java] view plaincopy
  1. public interface Subject {  
  2.       
  3.     /*增加观察者*/  
  4.     public void add(Observer observer);  
  5.       
  6.     /*删除观察者*/  
  7.     public void del(Observer observer);  
  8.       
  9.     /*通知所有的观察者*/  
  10.     public void notifyObservers();  
  11.       
  12.     /*自身的操作*/  
  13.     public void operation();  
  14. }  
[java] view plaincopy
  1. public abstract class AbstractSubject implements Subject {  
  2.   
  3.     private Vector<Observer> vector = new Vector<Observer>();  
  4.     @Override  
  5.     public void add(Observer observer) {  
  6.         vector.add(observer);  
  7.     }  
  8.   
  9.     @Override  
  10.     public void del(Observer observer) {  
  11.         vector.remove(observer);  
  12.     }  
  13.   
  14.     @Override  
  15.     public void notifyObservers() {  
  16.         Enumeration<Observer> enumo = vector.elements();  
  17.         while(enumo.hasMoreElements()){  
  18.             enumo.nextElement().update();  
  19.         }  
  20.     }  
  21. }  
[java] view plaincopy
  1. public class MySubject extends AbstractSubject {  
  2.   
  3.     @Override  
  4.     public void operation() {  
  5.         System.out.println("update self!");  
  6.         notifyObservers();  
  7.     }  
  8.   
  9. }  


测试类:

[java] view plaincopy
  1. public class ObserverTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Subject sub = new MySubject();  
  5.         sub.add(new Observer1());  
  6.         sub.add(new Observer2());  
  7.           
  8.         sub.operation();  
  9.     }  
  10.   
  11. }  

输出:

update self!
observer1 has received!
observer2 has receive

分享到:
评论

相关推荐

    KVO观察者模式

    **观察者模式(Observer Pattern)**,又称为发布-订阅(Publish/Subscribe)模式,是软件设计模式中的一种行为模式。在iOS开发中,Key-Value Observing (KVO) 是苹果实现观察者模式的一种机制,它允许一个对象监听...

    PHP 观察者模式的实现代码

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,当对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在PHP中,我们可以利用SPL(Standard PHP Library)中的`...

    IOS 委托模式KVO实例Demp

    1. 添加观察者:使用`[observedObject addObserver:self forKeyPath:@"keyPath" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];`来注册观察者。 2. 实现观察者方法:`- (void)...

    swift-在Swift中观察值的最简单的方法

    首先,让我们理解什么是观察者模式(Observer Pattern)。这是一种设计模式,允许对象在状态发生改变时通知其他依赖它的对象。在Swift中,我们可以通过`Observable`对象来实现这一模式,这通常涉及到订阅(subscribe...

    iOS中KVCDemo

    - **实现观察者方法**:在观察者类中实现`observeValueForKeyPath:ofObject:change:context:`方法,处理接收到的通知。 ```objc - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:...

    MAC下KVO,KVC的小demo

    KVO是Objective-C提供的一种观察者模式实现,它允许对象监听其他对象某个属性的变化。当被观察的对象的某个属性值改变时,KVO会自动通知所有注册的观察者。这个过程无需手动调用通知方法,简化了代码并增强了代码的...

    KVO简单demo

    3. **上下文**: `context`参数可以自定义,用于区分不同观察者可能对同一属性的不同监听行为。 4. **观察者回调**: 当被观察对象的属性发生变化时,会调用观察者的`observeValueForKeyPath:ofObject:change:context...

    KVO_App:iOS Objective-C中KVC和KVO的基本实现

    **KVO** 是Objective-C中的观察者模式实现,允许一个对象(观察者)监听另一个对象(被观察者)的属性变化,并在属性改变时收到通知。 **基本实现**: - 首先,观察者需要注册对被观察者的某个属性进行观察,使用`...

    ios kvoDemo

    这里,`observedObject`是被观察的对象,`self`是观察者,`"property"`是要观察的属性名,`options`指定观察的细节(如只关注新值或旧值),`context`可以作为自定义的上下文信息。 2. **实现观察者方法** 观察者...

    21-C-ImmutableObject-Code.zip

    观察不变性(Observed Immutability)更关注对象对外部的可见行为。即使对象的内部状态可能在某些操作中发生变化,但这些变化对外部是不可见的,即对象的外部接口不会反映出这些变化。例如,`System.Collections....

    System Verilog Assertion简介

    通过使用SVA,设计者可以更加精确地定义期望的行为模式,并能轻松地识别出不符合预期的情况。此外,SVA还支持自动收集功能覆盖率数据,这对于提高验证质量和效率至关重要。掌握SVA的基础知识对于从事硬件设计和验证...

    stix-v2.0研读笔记.docx

    8. 观察数据(Observed Data):记录实际观测到的网络活动。 9. 报告(Report):汇总威胁情报的文档,可能包含多个STIX对象。 10. 威胁者(Threat Actor):描述潜在的攻击者及其动机和能力。 11. 工具(Tool):...

    iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    KVO基于KVC实现,是一种观察者模式,当对象的某个属性值发生变化时,观察者会收到通知。使用KVO的步骤如下: - 注册观察者:`[observedObject addObserver:self forKeyPath:@"property" options:0 context:nil];` - ...

    systemverilog+assertions应用指南

    - 观察(Observed)阶段:在这个阶段检查所有属性,完成断言的评估过程。 SystemVerilog断言是现代硬件设计和验证的关键技术之一。通过使用SVA,工程师可以更容易地编写和维护复杂的验证测试,同时提高验证的效率和...

    Notes.docx

    行为学习中,当轻微错误发生时,智能体会遇到未曾学习过的状况,导致更多的错误,逐渐偏离学习到的行为模式。这突显了经验回放和泛化的必要性。 3. **Dagger算法** Dagger算法用于解决数据集需求大和记忆参与的...

    SwiftUI.Essentials.iOS.15和16.Edition PDF

    2. **状态观察者**:`@State`现在可以观察其他属性的变化,而不仅仅是自身。 3. **Focus Manager**:增强了对焦点控制和辅助功能的支持,允许更精细的焦点导航和交互。 4. **自定义形状**:开发者可以创建自定义...

    Learn-SwiftUI-DesignCode:我的DesignCode的Learn SwiftUI项目

    `@State`标记的变量会在值改变时自动触发视图更新,`@ObservedObject`和`@EnvironmentObject`则用于在多个视图之间共享和观察数据模型。`@Published`属性包装器配合`Combine`框架,可用于实现发布-订阅模式的数据流...

    pomp:使用部分观察到的马尔可夫过程进行统计推断的R包

    在统计学和数据分析领域,部分观察到的马尔可夫过程(Partially Observed Markov Processes, POMPs)是一个重要的工具,它允许我们处理那些无法完全观测到的状态变量的情况。R语言作为一个强大的统计分析平台,提供...

Global site tag (gtag.js) - Google Analytics