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

遵循开闭原则实现网球场管理软件遇问题,求合适设计模式建议

解决方案:改进策略模式实现开闭原则

报错原因分析

你遇到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:15:53