2

我有一个域模型,保存在一个数据库中,它代表一个图。图由通过分支连接的节点(例如 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();

我只是想知道,是否有任何相关的设计模式,这有助于使用良好的设计原则实现上述目标。我希望这是有道理的。任何反馈将不胜感激。

4

1 回答 1

1

引擎看起来像是在破坏 Open/Closed 主体,也可能是单一责任主体。如果 Engine 的目的是进行一些计算,那么它可能不应该知道如何从不同的节点类型创建 ID1 或 ID2,这将违反 SRP。名称 AddNodeTypeA 和 AddNodeTypeB 让我认为可能存在 C、D 等。这意味着任何新的 NodeType 都需要更改引擎类,这就是 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();
于 2012-09-19T17:11:38.487 回答