我想确定构建一些代码的最佳方法。我承认这可能是过度的,正在变成比实际更具学术性的东西。有时你无法自拔。有没有一种在C#中实现此模板方法或策略类模式的优雅方法?
让我图谋一个简单的例子:
假设你的类/接口,如:
interface IProcessedPhoto { }
interface IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes);
void Alter(IProcessedPhoto processedPhoto);
}
class PhotoProcessedWithAMethod : IProcessedPhoto { }
class PhotoProcessedWithBMethod : IProcessedPhoto { }
class AProcessor : IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes); // Returns PhotoProcessedWithAMethod
void Alter(IProcessedPhoto processedPhoto)
{
var casted = processedPhoto as PhotoProcessedWithAMethod;
// a "B" would crash here.
}
}
class BProcessor : IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes); // Returns PhotoProcessedWithBMethod
void Alter(IProcessedPhoto processedPhoto)
{
var casted = processedPhoto as PhotoProcessedWithBMethod;
// an "A" would crash here.
}
}
class Algorithm
{
void DoStuff()
{
var processor = ProcessorFactory.CreateProcessor(//stuff);
var processedPhoto = processor.ProcessPhoto(new byte[100]);
processor.Alter(processedPhoto);
}
}
所以基本上我想要的DoStuff()方法来创建一种图像处理器,和呼叫适当的Process方法。但是,尽管接口所暗示的是,进程只适用于相应类型的IProcessedPhoto(A和B照片不可互换,它们只是具有类似的方法名称)。我的真实代码比较复杂,因为每个处理器都有几个特定于它们的类,而且不可互换,但我想执行一组“逻辑”操作,如模板方法。
var artifactA = processor.DoA();
var artifactB = processor.DoB();
var final = processor.Process(artifactA, artifactB);
我希望能解释一下。
谢谢,我正在尝试此路径。我不喜欢它的一件事(你指出我认为)是由CreateProcessor返回的对象除了对象之外没有共同的祖先。我无法编写与As或Bs一起工作的代码(但不能同时使用这两种代码),而无需投入更通用的代码,在这种情况下,我又回到了开始的地方。 – Jeremy 2011-05-31 18:13:15
您可以从工厂返回一个'IPhotoProcessor'。但工厂方法本身需要该类型参数;这迫使客户知道哪个值用于类型参数。更好的方法是将整个交互封装在另一个对象中,并且客户端不需要担心来自'Process'方法的返回值。 –
2011-05-31 18:31:38