我有一个域模型,持久存储在一个表示图形的数据库中。图形由通过分支连接的节点(例如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();
我只是想知道,如果有任何相关的设计模式,这有助于实现上述使用良好的设计原则。我希望这是有道理的。任何反馈都将非常感激。
答案 0 :(得分:1)
引擎看起来像是打破了开放/已结束的委托人,也可能是单一责任委托人。如果Engine的目的是进行一些计算,那么它可能不应该知道如何从不同的节点类型创建ID1或ID2,这将是SRP违规。名称AddNodeTypeA和AddNodeTypeB让我认为可能存在C,D等。这意味着任何新的NodeType都需要Engine类来改变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();