Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 设计模式建议:图表->;计算_Oop_Design Patterns_Solid Principles_Design Principles - Fatal编程技术网

Oop 设计模式建议:图表->;计算

Oop 设计模式建议:图表->;计算,oop,design-patterns,solid-principles,design-principles,Oop,Design Patterns,Solid Principles,Design Principles,我有一个域模型,保存在数据库中,它表示一个图。图由通过分支连接的节点(例如NodeTypeA、NodeTypeB)组成。这两个通用元素(节点和分支将具有属性)。图形将被发送到计算引擎。要执行计算,必须对发动机进行如下初始化(简化伪代码): 最后,按照如下方式执行计算: Engine.DoSomeComputation(); 我只是想知道,是否有任何相关的设计模式存在,这有助于实现上述使用良好的设计原则。我希望这是有道理的。任何反馈都将不胜感激。引擎看起来似乎打破了开放/封闭原则,可能也打破了单

我有一个域模型,保存在数据库中,它表示一个图。图由通过分支连接的节点(例如NodeTypeA、NodeTypeB)组成。这两个通用元素(节点和分支将具有属性)。图形将被发送到计算引擎。要执行计算,必须对发动机进行如下初始化(简化伪代码):

最后,按照如下方式执行计算:

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();