您可以通过使用Func <>将字符串绑定到类和方法调用。它在处理你正在处理的许多排列方面给你很大的灵活性。我有一个下面的代码的例子,但你可以使用枚举而不是字符串作为键。
这不一定是一种模式,但它可以用于已经提到的几种模式。
public void Call(Stream str)
{
//Single Permission
Generate["PermissionA"](str);
//Say this user has multiple permissions, you can iterate over them
IEnumerable<string> userPerms = GetUserPerms();
foreach (var perm in userPerms)
{
Generate[perm](str);
}
}
public static Dictionary<string, Func<Stream, object>> Generate
{
get
{
var ret = new Dictionary<string, Func<Stream, object>>();
ret.Add("PermissionA", (s) =>
{
Class1 cl1 = new Class1(s);
Class4 cl4 = new Class4(s);
Class6 cl6 = new Class6(s);
cl1.Method2();
cl1.Method7();
cl4.Method1();
cl4.Method2();
cl6.Method1();
cl6.Method2();
cl1.DoXml();
cl4.DoXml();
cl6.DoXml();
return "";
});
ret.Add("PermissionB", (s) =>
{
Class2 cl2 = new Class2(s);
Class3 cl3 = new Class3(s);
Class5 cl5 = new Class5(s);
cl2.Method2();
cl2.Method7();
cl3.Method1();
cl3.Method2();
cl5.Method1();
cl5.Method2();
cl2.DoXml();
cl3.DoXml();
cl5.DoXml();
return "";
});
return ret;
}
}
看起来你可能有3步算法,也许这可以通过[模板方法模式](http://en.wikipedia.org/wiki/Template_method_pattern)表达。 –
精心制作分组条款。 – abatishchev
如果没有这些类/方法正在做什么的硬性示例,很难提出建议。你说他们是不同的方法,但是他们是否都有共同的最终目标(认证用户,分配资源等)? – Ocelot20