【Unity与23种设计模式】观察者模式(Observer)

本文介绍了观察者模式的基本概念,通过社交网络的例子展示了该模式的实际应用,并提供了C#中观察者模式的具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

GoF中定义:

“在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知。”

 

现实中,社交网络就是个例子。

以前的报社,每次出新刊的时候,

报刊便会将新刊一本一本的送到订阅报刊人的手中

于是,每次出新刊,报社都得送到每个人的手中

而如今的微博,便是应用了观察者模式

当想关注某个人时,只需要点击关注便可订阅

当关注的人更新微博时,只需要更新到微博平台

订阅的人就可以接收到更新的消息

而不需要被关注的那个人向每个订阅者发送消息

 

C#中的事件系统(Event)便是使用的观察者模式

Unity中的所有事件(如UI点击事件)也是应用的观察者模式

 

//事件接口
public abstract class Subject {
    List<Observer> m_Observers = new List<Observer>();

    public void Attach(Observer theObserver) {
        m_Observers.Add(theObserver);
    }

    public void Detach(Observer theObserver) {
        m_Observers.Remove(theObserver);
    }

    public void Notify() {
        foreach (Observer theObserver in m_Observers)
            theObserver.Update();
    }
}
//实现事件
public class ConcreteSubject : Subject {
    string m_SubjectState;

    public void SetState(string state) {
        m_SubjectState = state;
        Notify();
    }

    public string GetState() {
        return m_SubjectState;
    }
}
//观察者接口
public abstract class Observer {
    public abstract void Update();
}
//实现观察者
public class ConcreteObserver : Observer {
    string m_SubjectState;

    ConcreteSubject m_Subject = null;

    public ConcreteObserver(ConcreteSubject theSubject){
        m_Subject = theSubject;
    }

    public override void Update()
    {
        Debug.Log("ConcreteSubject.Update");
    }
}
//测试类
public class TestObserver {
    private void UnitTest() {
        ConcreteSubject theSubject = new ConcreteSubject();

        ConcreteObserver theObserver = new ConcreteObserver(theSubject);
        theSubject.Attach(theObserver);

        theSubject.SetState("Subject状态1");
    }
}

 

观察者模式的设计原理是,先设置一个主题(Subject)

让这个主题发布时可同时通知关心这个主题的观察者/订阅者

并且主题不必理会观察者/订阅者接下来会执行哪些操作

 

观察者模式的主要功能和优点:

将“主题发生”与“功能执行”这两个操作解除绑定

 

 

文章整理自书籍《设计模式与游戏完美开发》 菜升达 著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值