遵循开闭原则实现网球场管理软件遇问题,求合适设计模式建议
解决方案:改进策略模式实现开闭原则
报错原因分析
你遇到的CS1061错误,核心原因是父类引用无法直接调用子类特有的方法:你用AbstractFunction类型的引用指向子类实例,却试图调用子类独有的GetCourtByWeek方法,但AbstractFunction中没有定义这个方法,编译器无法识别。这说明你对策略模式的使用存在偏差——策略模式要求所有策略子类遵循统一的接口契约,而非各自定义独立方法。
推荐设计方案:统一接口的策略模式
针对你的网球场管理软件需求,正确使用策略模式即可满足开闭原则:新增功能只需添加新的策略子类,无需修改现有核心代码。具体实现步骤如下:
1. 定义统一的功能抽象类与标识枚举
抽象类中定义所有功能子类必须实现的统一执行方法,同时用枚举标识不同功能类型:
// 功能类型枚举,用于区分不同功能 public enum FunctionType { CourtOfWeek, CourtOfDay } // 抽象功能类,定义统一接口契约 public abstract class AbstractCourtFunction { // 获取当前功能的类型标识 public abstract FunctionType GetFunctionType(); // 统一执行方法,参数兼容week/day等整数类型输入 public abstract void Execute(int parameter); }
2. 实现具体功能子类
分别实现周查询和日查询的功能类,严格遵循抽象类的接口规范:
// 查询一周网球场信息的功能类 public class CourtOfWeekFunction : AbstractCourtFunction { public override FunctionType GetFunctionType() { return FunctionType.CourtOfWeek; } public override void Execute(int week) { Console.WriteLine($"输出第{week}周所有网球场信息"); // 此处添加实际业务逻辑 } } // 查询单日网球场信息的功能类 public class CourtOfDayFunction : AbstractCourtFunction { public override FunctionType GetFunctionType() { return FunctionType.CourtOfDay; } public override void Execute(int day) { Console.WriteLine($"输出第{day}天所有网球场信息"); // 此处添加实际业务逻辑 } }
3. 改造Tennis_Center类
维护功能实例列表,提供功能注册与统一执行的方法:
public class Tennis_Center { private List<AbstractCourtFunction> _functionList = new List<AbstractCourtFunction>(); // 注册新功能(新增功能仅需调用此方法,无需修改类内部逻辑) public void RegisterFunction(AbstractCourtFunction function) { _functionList.Add(function); } // 根据功能类型执行对应逻辑 public void ExecuteFunction(FunctionType type, int parameter) { var targetFunction = _functionList.FirstOrDefault(f => f.GetFunctionType() == type); targetFunction?.Execute(parameter); } }
4. 调用示例
// 初始化网球中心 var tennisCenter = new Tennis_Center(); // 注册现有功能 tennisCenter.RegisterFunction(new CourtOfWeekFunction()); tennisCenter.RegisterFunction(new CourtOfDayFunction()); // 执行周查询 tennisCenter.ExecuteFunction(FunctionType.CourtOfWeek, 3); // 执行日查询 tennisCenter.ExecuteFunction(FunctionType.CourtOfDay, 15);
新增功能的扩展示例
如果要新增CourtByHour(int hour)功能,只需添加新的子类并注册:
// 新增按小时查询的功能类 public class CourtOfHourFunction : AbstractCourtFunction { public override FunctionType GetFunctionType() { // 先给FunctionType枚举添加CourtOfHour成员 return FunctionType.CourtOfHour; } public override void Execute(int hour) { Console.WriteLine($"输出{hour}点所有网球场信息"); } }
注册并调用:
tennisCenter.RegisterFunction(new CourtOfHourFunction()); tennisCenter.ExecuteFunction(FunctionType.CourtOfHour, 14);
整个过程无需修改Tennis_Center或现有功能类的代码,完全符合开闭原则。
内容的提问来源于stack exchange,提问作者Z.J
相关产品推荐
相关产品推荐

