设计模式的建议:图 - >计算(design pattern advice: graph ->

2019-09-22 10:20发布

我有一个域模型,坚持在数据库中,它代表的图形。 的曲线图是由它们经由分支连接的节点(例如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();

我只是想知道,如果有任何相关的设计模式,在那里,这有助于实现上述使用好的设计原则。 我希望这是有道理的。 任何反馈将是非常赞赏。

Answer 1:

引擎看起来像它打破了开/关本金和大概单一责任主体太多。 如果引擎的目的是做一些计算,那么它可能不应该知道的是如何从将是一个违反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();


文章来源: design pattern advice: graph -> computation