目前我有一些类似的代码:
OntologyGenerator generator = new OntologyGenerator();
generator.AddOntologyHeader("Testing");
generator.AddClassDeclaration(owlBuilder);
generator.AddSubClass(owlBuilder);
generator.AddAnnotationAssertions(owlBuilder);
您看到传递的OwlBuilder参数中有这样的对象集合:
public class OwlLBuilder: IOwlLBuilder
{
private ICollection<IOwlClass> owlClasses = new Collection<IOwlClass>();
private ICollection<IOwlRelation> owlRelations = new Collection<IOwlRelation> ();
}
例如,当我说generator.AddClassDeclaration(owlBuilder)它将循环通过该owlBuilder参数的owlClasses集合,并对其执行一些操作…
我觉得这是一个丑陋的设计。你认为我可以利用修改我现有的代码来使用模板方法设计模式或任何其他更好的设计建议吗?好吧,有一些代码示例,这样我就可以在脑海中大致了解我应该做什么了!
我在这里真的看不到模板方法。我看到访问者模式。
下面是一个例子。
想象一下,你有一堆房子,你需要把它们都漆成黄色。现在你可以:
var houses = ... a list of houses ...
foreach (var house in houses)
{
house.Color = Color.Yellow;
}
但是,与其总是把你的房子漆成黄色,你可能希望这个动作(在这种情况下是绘画)抽象成其他东西。一个解决方案是编写一个类,负责将房子漆成黄色。该类稍后可以替换为另一个类,该类将房子涂成不同的颜色,或者对你的房子做一些完全不同的事情,比如增加另一层!
输入访问者模式。
我将展示一些我一直在使用的通用助手类和接口。我喜欢仿制药。如果你不这样做,那就自己滚吧。语义是:"访问者访问可访问对象"one_answers"可访问对象接受访问者"。
public interface IVisitor<in T> where T : IVisitable<T>
{
void Visit(T visitable);
}
public interface IVisitable<out T> where T : IVisitable<T>
{
void Accept(IVisitor<T> visitor);
}
public abstract class Visitable<T> : IVisitable<T> where T : Visitable<T>
{
public void Accept(IVisitor<T> visitor)
{
visitor.Visit((T)this);
}
}
public abstract class VisitableList<T> : List<T>, IVisitable<T> where T : Visitable<T>
{
public void Accept(IVisitor<T> visitor)
{
foreach (var item in this)
{
item.Accept(visitor);
}
}
}
现在我们可以这样设置我们的房子和房子列表:
public class House : Visitable<House>
{
public Color Color { get; set; }
}
public class Houses : VisitableList<House> {}
现在,访客——我们的画家——可以参观我们可参观的房子:
public class YellowPainter : IVisitor<House>
{
public void Visit(House visitable)
{
visitable.Color = Color.Yellow;
}
}
简单,优雅,责任单一(!)。
让我们布置房子:
var houses = new Houses();
houses.Add(new House() { Color = Color.Green });
houses.Add(new House() { Color = Color.Blue });
houses.Add(new House() { Color = Color.White });
现在我们准备粉刷我们所有的房子。只需要一个电话:
houses.Accept(new YellowPainter());
我们所有的房子现在都是黄色的。美好的
我们可以很容易地做到这一点:
houses.Accept(new AdditionalFloorsBuilder(floors: 2));
或者这个:
owlClasses.Accept(new OwlClassVisitor(owlBuilder, ...));
通过这样做,我们将owlClasses
中每个元素的实际"访问"与集合本身的迭代隔离开来。访问不必修改可访问性。它可以只用于检查可访问性,并使用信息来修改完全不同的内容,例如,您可以使用信息来提供owlBuilder
。