using System.Collections.Generic; namespace Model { public sealed class ObjectEvents { private static ObjectEvents instance; public Queue adds = new Queue(); public Queue removes = new Queue(); public HashSet updates = new HashSet(); public HashSet loads = new HashSet(); public static ObjectEvents Instance { get { return instance ?? (instance = new ObjectEvents()); } } public void Add(Disposer disposer) { adds.Enqueue(disposer); } public void Remove(Disposer disposer) { removes.Enqueue(disposer); } public void Update() { while(adds.Count > 0) { Disposer disposer = adds.Dequeue(); IUpdate update = disposer as IUpdate; if (update == null) { continue; } updates.Add(update); ILoad load = disposer as ILoad; if (load == null) { continue; } loads.Add(load); } while (removes.Count > 0) { Disposer disposer = removes.Dequeue(); IUpdate update = disposer as IUpdate; if (update == null) { continue; } updates.Remove(update); ILoad load = disposer as ILoad; if (load == null) { continue; } loads.Remove(load); } foreach(IUpdate update in updates) { Disposer disposer = (Disposer)update; if (removes.Contains(disposer)) { continue; } update.Update(); } } public void Load() { foreach (ILoad load in loads) { Disposer disposer = (Disposer)load; if (removes.Contains(disposer)) { continue; } load.Load(); } } } }