You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

观察者模式:对非发布者类隐藏update方法

观察者模式:对非发布者类隐藏update方法

嘿,针对你遇到的这个问题——不想让用户随便调用Entity的update()方法,只允许Event类触发,我给你几个实用的解决方案,都是实际项目里常用的思路:

1. 用显式接口实现+内部接口(最推荐)

先定义一个只有你的库内部能访问的观察者接口,然后让Entity显式实现这个接口。这样用户拿到Entity对象时,完全看不到update方法,只有你的Event类能通过接口类型调用它。

代码示例(以C#为例):

// 这个接口设为internal,用户的代码看不到它
internal interface IEventObserver
{
    void Update();
}

public class Entity : IEventObserver
{
    // 显式接口实现,外部无法直接调用
    void IEventObserver.Update()
    {
        // 原来update方法里的逻辑
    }
}

public class Event
{
    private List<IEventObserver> _observers;

    public void Simulate()
    {
        // 执行模拟逻辑
        NotifyObservers();
    }

    private void NotifyObservers()
    {
        _observers.ForEach(observer => observer.Update());
    }
}

这种方式最稳妥,用户哪怕想调用update都找不到入口,完全避免了误操作的可能。

2. 利用访问修饰符限制范围

如果你的Event和Entity在同一个程序集里,可以把update方法设为internal,这样只有同程序集的类能调用,用户的代码(一般在外部程序集)就访问不到了。要是用户需要继承Entity,还可以用private protected(C# 7.2+),既允许同程序集的Event调用,又不让子类直接调用这个方法。

示例代码:

public class Entity
{
    // 仅同程序集类可调用,子类也无法直接访问
    private protected void Update()
    {
        // 处理逻辑
    }
}

public class Event
{
    private List<Entity> _observers;

    public void Simulate()
    {
        // 模拟逻辑
        NotifyObservers();
    }

    private void NotifyObservers()
    {
        _observers.ForEach(o => o.Update());
    }
}

3. 用委托回调替换公开方法

换个思路,不让Entity暴露update方法,而是在订阅时通过委托传递回调,或者在Entity内部封装一个仅Event能触发的方法。比如把原来的update改成internal的触发方法,用户完全看不到这个方法:

public class Entity
{
    // 内部方法,用户代码无法访问
    internal void TriggerUpdate()
    {
        // 原来update的逻辑
    }
}

public class Event
{
    private List<Entity> _observers;

    public void Simulate()
    {
        // 模拟逻辑
        _observers.ForEach(o => o.TriggerUpdate());
    }
}

小总结

如果是C#环境,最推荐第一种显式接口的方案,既能保证Event正常触发更新,又彻底对用户隐藏了敏感方法,从根源上避免了误调用导致的模拟状态异常。

备注:内容来源于stack exchange,提问作者Afelium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:03:01