前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式--观察者模式

设计模式--观察者模式

原创
作者头像
软件架构师Michael
发布2023-07-25 08:56:06
2320
发布2023-07-25 08:56:06
举报
文章被收录于专栏:软件工程师Michael

设计模式中的观察者模式是一种行为型模式,用于在对象之间建立一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会自动得到通知并做出相应的更新。观察者模式中包含两种主要角色:被观察者(Subject)和观察者(Observer)。被观察者具有添加、删除和通知观察者的功能,而观察者则实现更新方法,在接收到被观察者的通知后进行更新操作。

以下是一个 C# 代码实例:

代码语言:javascript
复制
using System;
using System.Collections.Generic;

// 定义被观察者接口
interface ISubject
{
    void AddObserver(IObserver observer);    //添加观察者
    void RemoveObserver(IObserver observer); //移除观察者
    void NotifyObservers();                  //通知所有观察者
}

// 定义观察者接口
interface IObserver
{
    void Update(ISubject subject);           //更新方法
}

// 具体被观察者类
class ConcreteSubject : ISubject
{
    List<IObserver> observers = new List<IObserver>();   //维护观察者列表
    string state;                                      //被观察对象状态

    public void AddObserver(IObserver observer)
    {
        observers.Add(observer);
        Console.WriteLine("Observer added.");
    }

    public void RemoveObserver(IObserver observer)
    {
        observers.Remove(observer);
        Console.WriteLine("Observer removed.");
    }

    public void NotifyObservers()
    {
        Console.WriteLine("Subject state changed.");
        foreach (IObserver observer in observers)
        {
            observer.Update(this);
        }
    }

    // 设置被观察对象状态
    public void SetState(string state)
    {
        this.state = state;
        NotifyObservers();   //状态改变时通知所有观察者
    }

    // 获取被观察对象状态
    public string GetState()
    {
        return state;
    }
}

// 具体观察者类
class ConcreteObserver : IObserver
{
    string name;

    public ConcreteObserver(string name)
    {
        this.name = name;
    }

    public void Update(ISubject subject)
    {
        Console.WriteLine("{0} is notified. Subject state is {1}", 
            name, ((ConcreteSubject)subject).GetState());
    }
}

// 测试代码
class Program
{
    static void Main(string[] args)
    {
        //创建被观察者对象
        ConcreteSubject subject = new ConcreteSubject();

        //创建观察者对象
        ConcreteObserver observer1 = new ConcreteObserver("Observer1");
        ConcreteObserver observer2 = new ConcreteObserver("Observer2");

        //将观察者对象添加到被观察者对象的观察者列表
        subject.AddObserver(observer1);
        subject.AddObserver(observer2);

        //改变被观察对象状态,触发通知
        subject.SetState("new state");
    }
}

运行结果:

代码语言:javascript
复制
Observer added.
Observer added.
Subject state changed.
Observer1 is notified. Subject state is new state
Observer2 is notified. Subject state is new state

【代码分析】

在这个实例中,被观察者类为 ConcreteSubject,实现了 ISubject 接口中的方法,包括添加、移除观察者及通知所有观察者的功能。具体观察者类为 ConcreteObserver,实现了 IObserver 接口中的 Update 方法,在被观察者状态改变时进行相应的操作。程序通过创建被观察者和观察者对象,并将观察者添加到被观察对象的观察者列表中,然后改变被观察对象状态,触发通知所有观察者的事件。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档