尝试创建一个简单的noddy示例,以便我可以使用流畅的接口构建我的下一个项目。 我需要为我的dll用户提供一个直观的逐步构建类的方法。
问题。 我希望用户只在第一次启动时看到Initialise,然后是step1,然后是step2 然后结束?我该怎么做?
这是我的尝试,只要你把“。”你看到了一切,然后隐藏起来。
class Program
{
static void Main(string[] args)
{
IEnd builder = new StepBuilder()
.Initialize()
.LoadStuff()
.Validate()
.End();
}
}
public class StepBuilder : IInitialize,
IStep1,
IStep2,
IStep3,
IEnd
{
public IStep1 Initialize()
{
return this;
}
public IStep2 LoadStuff()
{
return this; ;
}
public IStep3 Validate()
{
return this;
}
public IEnd End()
{
return this;
}
public bool Save()
{
return true;
}
}
public class Step
{
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
public interface IInitialize
{
IStep1 Initialize();
}
public interface IStep1
{
IStep2 LoadStuff();
}
public interface IStep2
{
IStep3 Validate ();
}
public interface IStep3
{
IEnd End();
}
public interface IEnd
{
bool Save();
}
}
关于构建渐进式流畅界面的任何建议或良好链接?
答案 0 :(得分:3)
您可以将Initialize()
转换为静态工厂方法,并将构造函数设为私有。然后你的创作代码如下:
IEnd builder = StepBuilder.Initialize()
.LoadStuff()
.Validate()
.End();
第二个想法是使接口实现显式化。然后你只会看到你当时正在处理的界面的方法。
<强>更新强>
这是两种方法的示例代码。接口与您的问题完全相同。
工厂方法示例:
class Program
{
static void Main(string[] args)
{
IEnd builder = StepBuilder
.Initialize()
.LoadStuff()
.Validate()
.End();
}
}
public class StepBuilder : IInitialize,
IStep1,
IStep2,
IStep3,
IEnd
{
private StepBuilder()
{
}
public static IStep1 Initialize()
{
var builder = new StepBuilder();
//do initialisation stuff
return builder;
}
public IStep2 LoadStuff()
{
return this;
}
public IStep3 Validate()
{
return this;
}
public IEnd End()
{
return this;
}
public bool Save()
{
return true;
}
}
显式接口实现的示例:
class Program
{
static void Main(string[] args)
{
IEnd builder = new StepBuilder()
.Initialize()
.LoadStuff()
.Validate()
.End();
}
}
public class StepBuilder : IInitialize,
IStep1,
IStep2,
IStep3,
IEnd
{
public IStep1 Initialize()
{
return this;
}
public IStep2 IStep1.LoadStuff()
{
return this;
}
public IStep3 IStep2.Validate()
{
return this;
}
public IEnd IStep3.End()
{
return this;
}
public bool IEnd.Save()
{
return true;
}
}