以下是伪示例中的设计问题:
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 ?;
}
}
}
答案 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。