观察者模式

观察者模式,一个类中的变量发生改变,其他类能做出反应,像是在观察一样。是一个一对多的发布订阅关系。

原理:在一个类里维护一个数组或者链表,当其中的变量发生改变,遍历这个链表,调用这个链表中所有的对象中的对应的方法。

被观察者实现的接口
interface ISubject
{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify();
}

观察者实现的接口

interface IObserver
{
    void Update(int i);
}

被观察者实现类

class Subject : ISubject
{
    //维护的列表
    private readonly List<IObserver> _list = new();
    //需要监听的状态
    private int _state;
    
    public int State
    {
        get => _state;
        set
        {
            _state = value;
            Notify(); //当状态发生改变就告知列表中所有的对象
        }
    }
    
    public void Attach(IObserver observer)
    {
        _list.Add(observer);
    }
    
    public void Detach(IObserver observer)
    {
        if (_list.Contains(observer))
        {
            _list.Remove(observer);
        }
    }
    
    public void Notify()
    {
        foreach (var observer in _list)
        {
            observer.Update(State);
        }
    }
}

观察者实现类

class WhatObserver : IObserver
{
    private Subject _subject;
    
    public WhatObserver(Subject subject)
    {
        _subject = subject;
        subject.Attach(this);
    }
    
    public void Update(int num)
    {
        Console.WriteLine($"MyClass中的值变成了{num}");
    }
}

运行

public static class Program
{
    public static void Main(string[] args)
    {
        var myClass = new Subject();
        var whatObserver = new WhatObserver(myClass);
        myClass.State = 5;
    }
}

运行结果:

MyClass中的值变成了5

观察者模式可用于界面显示,数值改变了需要改动很多地方的显示,就能用这个模式。

返回顶部