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,如需转载请自行联系原作者

目录
相关文章
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
设计模式 消息中间件 存储
【设计模式】【行为型模式】观察者模式(Observer)
一、入门 什么是观察者模式? 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
510 9
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
283 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
349 2
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
161 1
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)

热门文章

最新文章