我正在编写一个转换器,它接受一些输入并提供输出。我需要根据我的输入类型调用特定的转换器。
public static myentrypoint( template t);
{
//I could do something like this.
switch(t)
{
case t1:
transformt1(..);
case t2:
transformt1(..);
....
}
}
Trasform1 : Itransform
{
tranform1(...);
}
Trasform2 : Itransform
{
tranform2(...);
}
我需要根据我的模板来映射要调用的函数。我可以做一个开关,但有更简洁的方法来使用一些设计模式吗?我在考虑编写静态字典。我是OOP的新手,所以任何建议都会很棒。
答案 0 :(得分:1)
如果template是一个类,并且每个模板可能有不同的转换,那么为什么不在模板类中包含转换函数呢?
public static myentrypoint( ITemplate t);
{
t.transform();
}
答案 1 :(得分:0)
我执行这些类型的情况的方式是使用Generics。 (Shameless self-promotion of a blog post)
基本上,您的基类设置如下:
public abstract class Transformer<T>
where T : Template
{
public abstract void Transform(T item);
}
然后你可以得到每个类型:
public class Transformer1 : Tansformer<Template1>
{
public void Transform(Template1 item)
{
}
}
public class Transformer2 : Transformer<Template2>
{
public void Transform(Template2 item)
{
}
}
然后您只需factory就可以找到正确的Transformer
。
public class TransformFactory
{
public Transformer<T> GetTransformer<T>(T item)
{
if (item is Template1)
return new Transformer1();
else if (item is Template2)
return new Transformer2();
// ...
}
}
这种方法的好处是,您可以在具体实现中将所有行为封装在该特定类型上。如果他们都有任何共同的行为,你可以在抽象基础上做到这一点。
答案 2 :(得分:0)
在 OOP 中,基于[打开 / 关闭 原则],它表示软件实体,例如类和函数应打开以进行扩展,但已关闭 修改。
使用 switch-case statement 的方法会对此原则提出质疑。为了在代码内部实现这个原则而没有 导致其功能发生变化。
我们使用名为&#34;委托字典模式&#34; 的模式。
例如,我们有一个名为Template的实体,用于保存输入值以及一些用于处理此模板的Transform类。
用于保持输入值的模板类
public class Template
{
public int TransformNo { get; set; }
public string Title { get; set; }
}
ITransform 转换抽象
的界面public interface ITransform
{
void Do(Template template);
}
Transform1 是ITransform的具体类
public class Transform1 : ITransform
{
public void Do(Template template)
{
Console.WriteLine($"Transform : {template.TransformNo}, TemplateTitle : { template.Title}");
}
}
Transform2 是ITransform的具体类
public class Transform2 : ITransform
{
public void Do(Template template)
{
Console.WriteLine($"Transform : {template.TransformNo}, TemplateTitle : { template.Title}");
}
}
用于协调* ITransformer ** 模板的TransformCordinator 类
public class TransformCordinator
{
Dictionary<int, Action<Template>> transformMap = new Dictionary<int, Action<Template>>();
public TransformCordinator()
{
transformMap.Add(1, x => new Transform1().Do(x));
transformMap.Add(2, x => new Transform2().Do(x));
}
public void Do(Template template)
{
transformMap[template.TransformNo](template);
}
}
//示例
class Program
{
static void Main(string[] args)
{
var transformCordinator = new TransformCordinator();
transformCordinator.Do(new Template() { TransformNo = 1, Title = "Hi!" });
Console.ReadLine();
}
}