【问题标题】:Achieving State like pattern without having +3 entities? C#在没有 +3 实体的情况下实现类似状态的模式? C#
【发布时间】:2009-08-11 14:59:24
【问题描述】:

这是伪示例中的设计问题:

它是 ASP.NET 用户控件 (UC),它使用“Food”对象作为数据源,并且该对象具有属性 FoodType - “Veg” || “非蔬菜”。

用户控件根据 FoodType 属性更改 UI 显示。在用户控件的代码隐藏类中,某些方法具有相同的 if/then/else 条件:if(Food.FoodType == "Veg")... else ...

在这里,我想使用类似状态的模式,这样用户控件的代码隐藏类将包含 两个内部/嵌套类,即“VegFood”类和“非素食”课程。现在,假设 NonvegFood 类将包含它自己的逻辑实现。

但是只有一个接口,两个实例类(嵌套)只用于这个用户控件,可能是过度设计。除此之外,UC 没有驱动方法,我可以在一个 if 块中调用相关方法,例如“DataBound”和“ItemCreated”。

仍然可以在 UC 类中使用类似 State 的模式吗?可能是 UC 内部的两个实例内部类,如果我可以将调用委托给这些内部类之一?

class UC : UserControl
{

    class VegFood
    {
        string DisplayName
        {
          get
          {
            return "Rice";
          }
        }       
    }

    class NonvegFood
    {
        string DisplayName
        {
          get
          {
            return "Chicken";
          }
        }       
    } 

    protected string DisplayName
    {
        get
        {
            return Instance.DisplayName;
        }
    }

    /*********** MAGIC Property ****************/
    private ? Instance
    {
        get
        {
           return ?;
        }
    }
}

【问题讨论】:

    标签: c# .net asp.net design-patterns oop


    【解决方案1】:

    如果让代码更易于维护,我认为拥有三个嵌套类并不是设计过度。

    我建议使用一个抽象的 State 基类来定义你的状态契约。每个州都将从这里继承。

    扩展您的代码示例:

    class UC : UserControl
    {
    
    protected string DisplayName
    {
        get
        {
            return Instance.DisplayName;
        }
    }
    
    /*********** MAGIC Property ****************/
    private FoodState _instance = null;
    
    private FoodState Instance
    {
        get
        {
           if (_instance == null)
           {
               if (FoodType == "Veg")
               {
                     _instance = new VegFood();
               }
               else
               {
                     _instance = new NonvegFood();
               }
           }
    
           return _instance;
        }
    }
    
    
    abstract class FoodState
    {
        abstract public string DisplayName {get;}
    }
    
    class VegFood : FoodState
    {
        public string DisplayName
        {
          get
          {
            return "Rice";
          }
        }       
    }
    
    class NonvegFood : FoodState
    {
        public string DisplayName
        {
          get
          {
            return "Chicken";
          }
        }       
    }
    
    }
    

    您可能不需要直接在 UserControl 上使用受保护的 DisplayName 属性,因为 Instance.DisplayName 可以直接由 aspx 页面使用。

    【讨论】:

    • 谢谢马克。但正如我所提到的,实际上我正在寻找替代解决方案。一个用户控件类,在类中具有(小)类层次结构,嗯....
    • 用户控件具有自己的类层次结构与在用户控件中使用 语句之间的决定将取决于用户控件的多少部分视食物类型而定。如果很多,那么类层次结构(即使是私有的)是有意义的,因为它总体上减少了代码量)。如果不是,那么 if 语句可能更有意义。
    • 但是用户控件中私有类层次结构的用户可以指向域模型的一些可能的重构?也许 Food 需要重构?或者,与其拥有单个用户控件,不如将其表示为两个用户控件(可能从抽象控件继承)?
    猜你喜欢
    • 2023-03-26
    • 2012-08-17
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多