Oop 设计模式建议:图表->;计算
我有一个域模型,保存在数据库中,它表示一个图。图由通过分支连接的节点(例如NodeTypeA、NodeTypeB)组成。这两个通用元素(节点和分支将具有属性)。图形将被发送到计算引擎。要执行计算,必须对发动机进行如下初始化(简化伪代码): 最后,按照如下方式执行计算:Oop 设计模式建议:图表->;计算,oop,design-patterns,solid-principles,design-principles,Oop,Design Patterns,Solid Principles,Design Principles,我有一个域模型,保存在数据库中,它表示一个图。图由通过分支连接的节点(例如NodeTypeA、NodeTypeB)组成。这两个通用元素(节点和分支将具有属性)。图形将被发送到计算引擎。要执行计算,必须对发动机进行如下初始化(简化伪代码): 最后,按照如下方式执行计算: Engine.DoSomeComputation(); 我只是想知道,是否有任何相关的设计模式存在,这有助于实现上述使用良好的设计原则。我希望这是有道理的。任何反馈都将不胜感激。引擎看起来似乎打破了开放/封闭原则,可能也打破了单
Engine.DoSomeComputation();
我只是想知道,是否有任何相关的设计模式存在,这有助于实现上述使用良好的设计原则。我希望这是有道理的。任何反馈都将不胜感激。引擎看起来似乎打破了开放/封闭原则,可能也打破了单一责任原则。若引擎的目的是进行一些计算,那个么它可能不知道如何从不同的节点类型创建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();
你认为这会更适合程序员网站stackoverflow.com吗?谢谢-我会消化的。我只是消费者或引擎,所以这是我的控制。
var engine = new Engine();
Branch id1 = new NodeTypeABranchAdapter(TypeA).GetBranch();
Branch id2 = new NodeTypeBBranchAdapter(TypeB).GetBranch();
engine.AddBranch(id1, id2);
engine.DoSomeComputation();