设计模式之美:Observer(观察者)

简介:

索引

别名

  • Dependency
  • Publish-Subscribe

意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

结构

参与者

Subject

  • Subject 知道它的 Observer。可以有任意多个 Observer 观察同一个 Subject。
  • 提供注册和删除 Observer 的接口。

Observer

  • 为那些在 Subject 发生改变时需要获得通知的对象定义一个 Update 接口。

ConcreteSubject

  • 将有关状态存储各个 ConcreteObserver 对象。
  • 当它的状态发生改变时,想它的各个 Observer 发出通知。

ConcreteObserver

  • 维护一个指向 ConcreteSubject 对象的引用。
  • 存储有关状态,这些状态应该与 ConcreteSubject 的状态保持一致。
  • 实现 Observer 的更新接口以使自身状态与 ConcreteSubject 状态保持一致。

适用性

在以下情况下可以使用 Observer 模式:

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其他对象,而它又不能假定其他对象时谁。

效果

  • 目标与观察者间的抽象耦合。
  • 支持广播通信。
  • 意外的更新。因为 Observer 并不知道其他 Observer 的存在,所以对改变 Subject 的最终代价一无所知。

相关模式

  • 可以使用 Mediator 模式封装复杂的更新语义,充当 Subject 与 Observer 之间的中介者。

实现

下面的交互图描述 Subject 与 Observer 之间的协作:

实现方式(一):Observer 模式结构样式代码。

推模式(Push Model):Subject 向 Observer 发送关于改变的详细信息,而不管它们是否需要。

拉模式(Pull Model):Subject 除最小通知外什么也不推送,由 Observer 显式地向 Subject 询问细节。

复制代码
 1 namespace ObserverPattern.Implementation1
 2 {
 3   public abstract class Observer
 4   {
 5     public abstract void Update();
 6   }
 7 
 8   public abstract class Subject
 9   {
10     private List<Observer> _observers = new List<Observer>();
11 
12     public void Attach(Observer observer)
13     {
14       _observers.Add(observer);
15     }
16 
17     public void Detach(Observer observer)
18     {
19       _observers.Remove(observer);
20     }
21 
22     public void Notify()
23     {
24       foreach (var observer in _observers)
25       {
26         observer.Update();
27       }
28     }
29   }
30 
31   public class ConcreteSubject : Subject
32   {
33     private string _state;
34 
35     public string State
36     {
37       get
38       {
39         return _state;
40       }
41       set
42       {
43         _state = value;
44         Notify();
45       }
46     }
47   }
48 
49   public class ConcreteObserver : Observer
50   {
51     private ConcreteSubject _subject;
52 
53     public ConcreteObserver(string name, ConcreteSubject subject)
54     {
55       Name = name;
56       _subject = subject;
57     }
58 
59     public string Name { get; private set; }
60 
61     public override void Update()
62     {
63       string subjectState = _subject.State;
64       Console.WriteLine(Name + ": " + subjectState);
65     }
66   }
67 
68   public class Client
69   {
70     public void TestCase1()
71     {
72       var subject = new ConcreteSubject();
73       subject.Attach(new ConcreteObserver("Observer 1", subject));
74       subject.Attach(new ConcreteObserver("Observer 2", subject));
75       subject.Attach(new ConcreteObserver("Observer 3", subject));
76 
77       subject.State = "Hello World";
78     }
79   }
80 }
复制代码














目录
相关文章
|
4月前
|
设计模式 存储 Java
认真学习设计模式之观察者模式(Observer Pattern)
认真学习设计模式之观察者模式(Observer Pattern)
28 0
|
10天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
4月前
|
设计模式 Java
Java设计模式:什么是观察者模式(Observer Pattern)?
Java设计模式:什么是观察者模式(Observer Pattern)?
31 0
|
6月前
|
设计模式
设计模式16 - 观察者模式【Observer Pattern】
设计模式16 - 观察者模式【Observer Pattern】
25 0
|
6月前
|
设计模式 Java API
【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)
87 0
|
6月前
|
设计模式 Java Spring
设计模式~观察者模式(Observer)-11
它属于行为型模式的一种。观察者模式定义了一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听。当这个主题对象状态变化时,会通知所有观察者对象并作出相应处理逻辑。 目录
45 0
|
9月前
|
设计模式 消息中间件 NoSQL
Java中23种面试常考的设计模式之观察者模式(Observer)---行为型模式
Java中23种面试常考的设计模式之观察者模式(Observer)---行为型模式
48 1
|
10月前
|
设计模式 存储
设计模式-观察者模式(Observer)
设计模式-观察者模式(Observer)
69 0
|
11月前
|
设计模式 Java
Java设计模式-观察者模式(Observer)
Java设计模式-观察者模式(Observer)
|
设计模式 API
设计模式学习(二):Observer观察者模式
在Observer模式中,当观察对象的状态发生变化时,会通知给观察者。Observer模式适用于根据对象状态进行相应处理的场景。
131 0
设计模式学习(二):Observer观察者模式