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

简介:

一、观察者模式简介(Brief Introduction

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能够自动更新自己。

二、解决的问题(What To Solve

当一个对象的改变需要同时改变其他对象的时候,而且不知道有多少对象有待改变时,应该考虑使用观察者模式。
观察者模式所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使的各自的变化都不会影响另一边的变化。

三、观察者模式分析(Analysis

1、观察者模式结构

Subject :它把所有对观察者对象的引用保存在一个聚集里面,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
public void Notify()
{
    foreach(Observer o in observers)
    {
          o.Update();
    }
ConcreteSubject 具体的主题,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记国的观察者发出通知。
 
Observer :抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己
ConcreteObserver :具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调

2、源代码

1 Subject 类, 主题或者抽象通知者
public  abstract class Subject
{
    private IList<Observer> observers = new List<Observer>();
 
    /// <summary>
    ///  添加观察者
    /// </summary>
    /// <param name="observer"> 观察者 </param>
    public void Attach(Observer observer)
    {
        observers.Add(observer);
    }
 
    /// <summary>
    ///  移除观察者
    /// </summary>
    /// <param name="observer"> 观察者 </param>
    public void Detach(Observer observer)
    {
        observers.Remove(observer);
    }
 
    /// <summary>
    ///  通知观察者
    /// </summary>
    public void Notify()
    {
        foreach (Observer o in observers)
        {
            o.Update();
        }
    }
}
 
2 ConcreteSubject 类, 具体主题或者具体通知者
public  class ConcreteSubject:Subject
{
    private string _subjectState;
 
    /// <summary>
    ///  具体被观察者状态
    /// </summary>
    public string SubjectState
    {
        get { return _subjectState; }
        set { _subjectState = value; }
    }
}
 
3 Observer 抽象观察者,为所有的具体观察者定义一个接口
public  abstract class Observer
{
    public abstract void Update();
}
 
4 ConcreteObserver 具体观察者
///   <summary>
///   具体观察者,实现抽象观察者角色所要求的更新接口
///   以便使本身的状态与主题的状态相协调
///   </summary>
public  class ConcreteObserver:Observer
{
    private string name;
    private string observerState;
    private ConcreteSubject subject;
 
    public ConcreteSubject Subject
    {
        get { return subject; }
        set { subject = value; }
    }
 
    public ConcreteObserver(ConcreteSubject subject,string name)
    {
        this.subject = subject;
        this.name = name;
    }
 
    public override void Update()
    {
        observerState = subject.SubjectState;
        Console.WriteLine(" 观察者{0}的新状态是{1}" ,name,observerState);
    }
}
 
5 、客户端代码
static  void  Main (string[] args)
{
    ConcreteSubject cs = new ConcreteSubject();
    cs.Attach(new ConcreteObserver(cs,"James"));
    cs.Attach(new ConcreteObserver(cs,"Jane"));
 
    cs.SubjectState="OK";
    cs.Notify();
    Console.Read();
}

3、程序运行结果











本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/258930,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
设计模式 监控 Java
Kotlin - 改良设计模式 - 观察者模式
Kotlin - 改良设计模式 - 观察者模式
56 3
|
17天前
|
设计模式 存储 供应链
前端必须掌握的设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,实现了一种订阅机制。它包含两个角色:**观察者**(订阅消息、接收通知并执行操作)和**被观察者**(维护观察者列表、发送通知)。两者通过一对多的关系实现解耦,当被观察者状态改变时,会通知所有订阅的观察者。例如,商店老板作为被观察者,记录客户的需求并在商品到货时通知他们。前端应用中,如DOM事件注册、MutationObserver等也体现了这一模式。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
45 1
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
31 3
|
3月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
38 9
|
3月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
41 2
|
3月前
|
设计模式 监控 UED
设计模式之观察者模式
【10月更文挑战第12天】 观察者模式是一种行为型设计模式,定义了一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动更新。主要由主题(被观察者)和观察者组成,实现对象间的松耦合,广泛应用于用户界面、事件驱动系统和数据监控等领域。
|
3月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
本教程详细讲解Kotlin语法,适合深入学习。对于快速掌握Kotlin,推荐“简洁”系列教程。本文特别介绍了观察者模式,包括使用Java API和Kotlin委托属性(如Delegates.observable)实现的方法,旨在帮助开发者更高效地实现和优化观察者模式的应用。
44 3