。观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:
我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。我们看实现代码:
一个Observer接口:
[java] view plaincopy
- public interface Observer {
- public void update();
- }
两个实现类:
[java] view plaincopy
- public class Observer1 implements Observer {
- @Override
- public void update() {
- System.out.println("observer1 has received!");
- }
- }
[java] view plaincopy
- public class Observer2 implements Observer {
- @Override
- public void update() {
- System.out.println("observer2 has received!");
- }
- }
Subject接口及实现类:
[java] view plaincopy
- public interface Subject {
- /*增加观察者*/
- public void add(Observer observer);
- /*删除观察者*/
- public void del(Observer observer);
- /*通知所有的观察者*/
- public void notifyObservers();
- /*自身的操作*/
- public void operation();
- }
[java] view plaincopy
- public abstract class AbstractSubject implements Subject {
- private Vector<Observer> vector = new Vector<Observer>();
- @Override
- public void add(Observer observer) {
- vector.add(observer);
- }
- @Override
- public void del(Observer observer) {
- vector.remove(observer);
- }
- @Override
- public void notifyObservers() {
- Enumeration<Observer> enumo = vector.elements();
- while(enumo.hasMoreElements()){
- enumo.nextElement().update();
- }
- }
- }
[java] view plaincopy
- public class MySubject extends AbstractSubject {
- @Override
- public void operation() {
- System.out.println("update self!");
- notifyObservers();
- }
- }
测试类:
[java] view plaincopy
- public class ObserverTest {
- public static void main(String[] args) {
- Subject sub = new MySubject();
- sub.add(new Observer1());
- sub.add(new Observer2());
- sub.operation();
- }
- }
输出:
update self!
observer1 has received!
observer2 has receive
相关推荐
**观察者模式(Observer Pattern)**,又称为发布-订阅(Publish/Subscribe)模式,是软件设计模式中的一种行为模式。在iOS开发中,Key-Value Observing (KVO) 是苹果实现观察者模式的一种机制,它允许一个对象监听...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,当对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在PHP中,我们可以利用SPL(Standard PHP Library)中的`...
1. 添加观察者:使用`[observedObject addObserver:self forKeyPath:@"keyPath" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];`来注册观察者。 2. 实现观察者方法:`- (void)...
首先,让我们理解什么是观察者模式(Observer Pattern)。这是一种设计模式,允许对象在状态发生改变时通知其他依赖它的对象。在Swift中,我们可以通过`Observable`对象来实现这一模式,这通常涉及到订阅(subscribe...
- **实现观察者方法**:在观察者类中实现`observeValueForKeyPath:ofObject:change:context:`方法,处理接收到的通知。 ```objc - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:...
KVO是Objective-C提供的一种观察者模式实现,它允许对象监听其他对象某个属性的变化。当被观察的对象的某个属性值改变时,KVO会自动通知所有注册的观察者。这个过程无需手动调用通知方法,简化了代码并增强了代码的...
3. **上下文**: `context`参数可以自定义,用于区分不同观察者可能对同一属性的不同监听行为。 4. **观察者回调**: 当被观察对象的属性发生变化时,会调用观察者的`observeValueForKeyPath:ofObject:change:context...
**KVO** 是Objective-C中的观察者模式实现,允许一个对象(观察者)监听另一个对象(被观察者)的属性变化,并在属性改变时收到通知。 **基本实现**: - 首先,观察者需要注册对被观察者的某个属性进行观察,使用`...
这里,`observedObject`是被观察的对象,`self`是观察者,`"property"`是要观察的属性名,`options`指定观察的细节(如只关注新值或旧值),`context`可以作为自定义的上下文信息。 2. **实现观察者方法** 观察者...
观察不变性(Observed Immutability)更关注对象对外部的可见行为。即使对象的内部状态可能在某些操作中发生变化,但这些变化对外部是不可见的,即对象的外部接口不会反映出这些变化。例如,`System.Collections....
通过使用SVA,设计者可以更加精确地定义期望的行为模式,并能轻松地识别出不符合预期的情况。此外,SVA还支持自动收集功能覆盖率数据,这对于提高验证质量和效率至关重要。掌握SVA的基础知识对于从事硬件设计和验证...
8. 观察数据(Observed Data):记录实际观测到的网络活动。 9. 报告(Report):汇总威胁情报的文档,可能包含多个STIX对象。 10. 威胁者(Threat Actor):描述潜在的攻击者及其动机和能力。 11. 工具(Tool):...
KVO基于KVC实现,是一种观察者模式,当对象的某个属性值发生变化时,观察者会收到通知。使用KVO的步骤如下: - 注册观察者:`[observedObject addObserver:self forKeyPath:@"property" options:0 context:nil];` - ...
- 观察(Observed)阶段:在这个阶段检查所有属性,完成断言的评估过程。 SystemVerilog断言是现代硬件设计和验证的关键技术之一。通过使用SVA,工程师可以更容易地编写和维护复杂的验证测试,同时提高验证的效率和...
行为学习中,当轻微错误发生时,智能体会遇到未曾学习过的状况,导致更多的错误,逐渐偏离学习到的行为模式。这突显了经验回放和泛化的必要性。 3. **Dagger算法** Dagger算法用于解决数据集需求大和记忆参与的...
2. **状态观察者**:`@State`现在可以观察其他属性的变化,而不仅仅是自身。 3. **Focus Manager**:增强了对焦点控制和辅助功能的支持,允许更精细的焦点导航和交互。 4. **自定义形状**:开发者可以创建自定义...
`@State`标记的变量会在值改变时自动触发视图更新,`@ObservedObject`和`@EnvironmentObject`则用于在多个视图之间共享和观察数据模型。`@Published`属性包装器配合`Combine`框架,可用于实现发布-订阅模式的数据流...
在统计学和数据分析领域,部分观察到的马尔可夫过程(Partially Observed Markov Processes, POMPs)是一个重要的工具,它允许我们处理那些无法完全观测到的状态变量的情况。R语言作为一个强大的统计分析平台,提供...