2010-07-21 137 views
1

我是新来的设计模式,因此对所有可用的知识有限。希望我可以提供一些关于我正在尝试解决的问题的详细信息,用户社区可以就使用哪种设计模式以及如何实施这些模式提供一些指导。相同返回对象但设计模式选项不同枚举类型值和参数值类型

  1. 返回对象是为每一个呼叫类型
  2. 底层类的实现可以在某些枚举类型来完成相同的(即操作类型= 1正常工作与ActionClass1但不ActionClass2和ActionClass3
  3. 类参数而变化基于上型

例如:

public enum ActionType 
{ 
    Action1, 
    Action2, 
    Action3 
} 

P ossible工厂模式实现:

public static class ActionClass 
{ 
     public static int DoAction(ActionType type, int val1, int val2) 
     { 
       switch (type) 
       { 
        case Type1: 
         return new ActionClass1(val1, val2).DoAction(); 
         break; 
        default: 
         throw new NotImplementedException();      
       } 
     } 

     public static int DoAction(ActionType type, string val1) 
     { 
      switch (type) 
       { 

        case Type2: 
         return new ActionClass2(val1).DoAction(); 
         break; 
        case Type3: 
         return new ActionClass3(val1).DoAction(); 
        default: 
         throw new NotImplementedException();      
       } 

     } 
}  

回答

1

取决于你的行动是,你可能想看看Strategy Pattern。否则,Factory Method Pattern看起来已经很不错了,尽管我可能会改变方法来不立即执行动作,但会返回一个封装动作的对象,并且在动作不支持动作时使用TryXXX模式而不是异常参数类型:

public static bool TryGetIntIntAction(
    ActionType type, out Func<int, int, int> func) 
{ 
    switch (type) 
    { 
    case ActionType.Action1: 
     func = (val1, val2) => new ActionClass1(val1, val2).DoAction(); 
     return true; 
    default: 
     func = null; 
     return false; 
    } 
} 

public static bool TryGetStringAction(
    ActionType type, out Func<string, int> func) 
{ 
    switch (type) 
    { 
    case ActionType.Action2: 
     func = val1 => new ActionClass2(val1).DoAction(); 
     return true; 
    case ActionType.Action3: 
     func = val1 => new ActionClass3(val1).DoAction(); 
     return true; 
    default: 
     func = null; 
     return false; 
    } 
} 
+0

我喜欢的尝试方法的想法。开发人员可能需要返回数据。你能解释一下func =(val1,val2)=>语法是什么吗? – 2010-07-21 21:20:39

+0

@Blake Blackwell:这是一个lambda表达式,这是写一个委托的简短方式。 'func =((val1,val2)=> ...)'给变量'func'分配一个函数,该函数接受两个参数('val1'和'val2')并返回'...'。 – dtb 2010-07-21 21:29:43

1

的常用方法重构上类型的开关是多态,通过为每个ActionType创建类。由于每个DoAction重载采用不同的参数,你可以在“参数对象封装这些每个动作类型与使用泛型它的参数类型相关联:

public abstract ActionClass<T> 
{ 
    public abstract int DoAction(T parameter); 
} 

public class ActionClass2 : ActionClass<string> 
{ 
    public override int DoAction(string parameter) { ... } 
} 
相关问题