在没有+3实体的情况下实现类似状态的状态? C#

时间:2009-08-11 14:59:25

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

以下是伪示例中的设计问题:

ASP.NET用户控件(UC)使用“Food”对象作为数据源,此对象具有属性FoodType - “Veg”|| “Nonveg”。

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

在这里,我想使用类似状态的模式,以便用户控件的代码隐藏类将包含 两个内部/嵌套类 ,即“VegFood”类和“NonvegFood”课程。现在,让我们说,NonvegFood类将包含自己的逻辑实现。

但是有一个接口,两个将在此用户控件中使用的实例类(如嵌套)可能会过度设计。除此之外,UC没有驱动程序方法,我可以在一个if块中调用相关方法,就像它们是“DataBound”和“ItemCreated”一样。

然而,是否有可能在UC课程中拥有类似模式的状态?可能是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 ?;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果它使代码更易于维护,我认为拥有三个嵌套类并不是设计上的过分。

我建议用一个抽象的基础状态类来定义你所在州的合同。每个州都会继承这个。

扩展您的代码示例:

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属性,因为aspx页面可以直接使用Instance.DisplayName。