设计模式---观察者模式---8

设计模式---观察者模式---8_第1张图片

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//被观察的对象基类,或者发布者基类
public abstract class Subject
{
    private List<Observer> observers = new List<Observer>();

    public void AddObserver(Observer observer)
    {
        observers.Add(observer);
    }

    public void RemvoeObserver(Observer observer)
    {
        observers.Remove(observer);
    }

    public void Notify()
    {
        foreach (Observer observer in observers)
        {
            observer.Update();
        }
    }
}

//具体主题类
public class ConcreteSubject : Subject
{	
    public string subjectState;
}

//观察者基类,或订阅者基类,也可以用接口IObserver
public abstract class Observer
{
    public abstract void Update();
}

//具体观察者
public class ConcreteObserver : Observer
{
    public override void Update()
    {
        //收到通知时,执行逻辑
    }
}

使用:

ConcreteSubject sub=new ConcreteSubject();
sub.AddObserver(new ConcreteObserver());
sub.Notify();

观察者模式缺点:所有要收到通知的类都要继承Observer,或者实现IObserver接口,虽然我们面向了抽象接口编程,但还是依赖了抽象的东西。

C#更好的实现:委托和事件

就不需要观察者基类或接口了,被观察者也可以简化

//被观察的对象接口
public interface Subject
{
    void Notify();
}

//具体主题类:添加一个(或多个)事件,其他想收到通知的只需绑定到这个事件即可。
public class ConcreteSubject : Subject
{
    public event Action UpdateEvent;
	
	//可以设置不同类型的事件
    public Dictionary<string, Action> UpdateEvents;

    public void Notify()
    {
        UpdateEvent?.Invoke();
    }
}

使用:

public class A
{
    public void Fun()
    {       
    }
}

ConcreteSubject concreteSubject = new ConcreteSubject();
A a=new A();
concreteSubject.UpdateEvent += a.Fun;

你可能感兴趣的:(设计模式,观察者模式,设计模式)