我有一个域模型,坚持在数据库中,它代表的图形。 的曲线图是由它们经由分支连接的节点(例如NodeTypeA,NodeTypeB)的。 两个通用元素(节点和分支将有属性)。 曲线图将被发送到一个计算引擎。 执行计算发动机必须被初始化像这样(简化的伪代码):
Engine Engine = new Engine() ;
Object ID1 = Engine.AddNodeTypeA(TypeA.Property1, TypeA.Property2, …, TypeA.Propertyn);
Object ID2 = Engine.AddNodeTypeB(TypeB.Property1, TypeB.Property2, …, TypeB.Propertyn);
Engine.AddBranch(ID1,ID2);
最后计算是这样进行的:
Engine.DoSomeComputation();
我只是想知道,如果有任何相关的设计模式,在那里,这有助于实现上述使用好的设计原则。 我希望这是有道理的。 任何反馈将是非常赞赏。
引擎看起来像它打破了开/关本金和大概单一责任主体太多。 如果引擎的目的是做一些计算,那么它可能不应该知道的是如何从将是一个违反SRP不同的节点类型创建ID1或ID2。 名称AddNodeTypeA和AddNodeTypeB使我觉得有可能是C,d等,这意味着任何新的节点类型将需要引擎类,以改变就是OCP似乎被打破。
适配器模式就解决了这两方面的担忧
class Engine
{
public void AddBranch(Branch branch1, Branch branch2)
{
//do something
}
public void DoSomeComputation();
{
//do something
}
}
interface BranchAdapter
{
Branch GetBranch();
}
class NodeTypeABranchAdapter : BranchAdapter
{
private readonly TypeA _typeA;
public NodeTypeABranchCreator(TypeA typeA)
{
_typeA = typeA;
}
public Branch GetBranch()
{
//do processing to take _typeA and transform it into Branch
}
}
class NodeTypeBBranchAdapter : BranchAdapter
{
private readonly TypeB _typeB;
public NodeTypeABranchCreator(TypeB typeB)
{
_typeB = typeB;
}
public Branch GetBranch()
{
//do processing to take _typeB and transform it into Branch
}
}
然后调用代码可以工作,像这样
var engine = new Engine();
Branch id1 = new NodeTypeABranchAdapter(TypeA).GetBranch();
Branch id2 = new NodeTypeBBranchAdapter(TypeB).GetBranch();
engine.AddBranch(id1, id2);
engine.DoSomeComputation();