观察者模式:对非发布者类隐藏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
相关产品推荐
相关产品推荐

