C#中类与类无需通过对象引用即可实现通信的方法有哪些?
优化实现方案
你可以根据业务复杂度选择以下几种无属性引用的实现方式:
方案1:依赖作为方法参数传递
改动最小的轻量化方案,不需要在类中存储全局引用,仅在需要交互的方法调用时传入目标对象即可,适合简单的一对一调用场景。
class Encounter { // 无需存储Shelter属性 public void CapturePet(Shelter targetShelter) { targetShelter.AddPet(new Pet()); } } // 调用侧写法 static void Main(string[] args) { shelter = new Shelter() { pets = new List<Pet>() }; encounter = new Encounter(); // 调用时传入Shelter即可 encounter.CapturePet(shelter); }
方案2:事件驱动(观察者模式)
完全解耦的实现方案,Encounter仅负责发布「捕获宠物」的事件,Shelter作为订阅者自行处理添加逻辑,双方不需要持有对方的引用,新增其他订阅逻辑也不需要修改现有代码,适合一对多通知场景。
class Encounter { // 定义捕获宠物事件,无需持有Shelter引用 public event Action<Pet> OnPetCaptured; public void CapturePet() { OnPetCaptured?.Invoke(new Pet()); } } // 调用侧只需要完成事件绑定即可 static void Main(string[] args) { shelter = new Shelter() { pets = new List<Pet>() }; encounter = new Encounter(); // 绑定事件:捕获到宠物后自动添加到收容所 encounter.OnPetCaptured += shelter.AddPet; }
后续如果要新增成就统计、日志记录等响应捕获宠物的逻辑,只需要新增对应订阅即可,不需要修改Encounter和Shelter的现有代码。
方案3:中介者模式
适合多对象复杂交叉交互的场景,所有业务对象仅和中介者通信,不需要互相持有引用,所有交互逻辑统一收敛在中介者中维护,避免类之间出现大量杂乱的引用依赖。
// 中介者抽象接口 interface IGameMediator { void NotifyPetCaptured(Pet pet); } // 具体中介者,统一维护所有交互逻辑 class GameMediator : IGameMediator { public Shelter Shelter { get; set; } // 后续新增其他交互对象都在这里声明 public void NotifyPetCaptured(Pet pet) { Shelter.AddPet(pet); // 其他交互逻辑都在这里统一处理,不需要修改业务类 } } class Encounter { private readonly IGameMediator _mediator; // 仅依赖中介者,不需要知道Shelter的存在 public Encounter(IGameMediator mediator) { _mediator = mediator; } public void CapturePet() { _mediator.NotifyPetCaptured(new Pet()); } } // 调用侧完成对象组装 static void Main(string[] args) { var shelter = new Shelter() { pets = new List<Pet>() }; var mediator = new GameMediator() { Shelter = shelter }; var encounter = new Encounter(mediator); }
选型建议
- 交互逻辑简单、仅少量一对一调用:优先选方案1,改动最小最直观
- 需要一对多通知、后续可能新增响应逻辑:优先选方案2,解耦程度最高
- 多模块交叉交互复杂、引用关系杂乱:优先选方案3,统一维护交互逻辑
内容的提问来源于stack exchange,提问作者Davis Murphy
相关产品推荐
相关产品推荐

