设计模式--观察者模式

2023-07-25 08:56:06 浏览数 (1)

设计模式中的观察者模式是一种行为型模式,用于在对象之间建立一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会自动得到通知并做出相应的更新。观察者模式中包含两种主要角色:被观察者(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 方法,在被观察者状态改变时进行相应的操作。程序通过创建被观察者和观察者对象,并将观察者添加到被观察对象的观察者列表中,然后改变被观察对象状态,触发通知所有观察者的事件。

0 人点赞