【问题标题】:Pattern to map Generic Data Structure to a Specific Data Structure将通用数据结构映射到特定数据结构的模式
【发布时间】:2010-02-08 06:27:00
【问题描述】:

我有一个分层的通用数据结构。有一个根节点,其下可以有很多树节点,也可以只有一个数据节点,而树节点可以有更多的树节点。一个基本的树形结构。

我系统中的所有数据都以这种格式保存。但是,我确实希望对这些数据结构所代表的一些不同类型的数据有一个强类型接口(即将通用层次结构树转换为强类型地址记录)。

我计划使用适配器模式,我将一个节点传递给适配器,然后它通过询问树来公开属性。这也将允许我验证树(即具有特定元素并且它们具有有效数据)。它还允许可扩展性(即,如果以后添加了其他数据,树本身也会暴露出来)。

您认为这是实现这一目标的最佳方法还是有更简单的方法?

注意:这是在 C# 和 .Net 4.0 中。

谢谢!

【问题讨论】:

  • 您是否研究过 AutoMapper 的自定义格式化程序?

标签: c# .net design-patterns data-structures tree


【解决方案1】:

适配器通常用于在两个incompatible interfaces 之间进行桥接。这似乎不是你的问题。事实上,我真的没有看到任何问题——由于对象语言本质上是分层的,因此您应该能够在类和树节点之间使用主要是一对一的映射。

也许你所说的“适配器”只是指一个类,它包装了一个节点或任何描述你的树节点的特定对象类型,我同意。应该有相当明显的父子关系,您可以通过让您的节点类拥有或以某种方式返回子节点/类的数组以及作为 getter/setter 的属性来描述。任何需要的验证都可以由设置器完成,或者如果需要在构造过程中作为类检查给定节点及其子节点。类似于以下内容:

public class NodeFu {

    private Node node;

    public NodeFu(Node node){
        this.node = node;
        // perhaps traverse and validate node data here
    }

    public String getNodeAttribute(String attrName){
        // pardon the offense, Demeter, only for demonstration...
        return node.getAttributes().getNamedItem(attrName).toString();
    }

    public void setNodeAttribute(String attrName, attrValue){
        node.setAttributeValue(attrName, attrValue);
    }

    public ArrayList<NodeFu> getChildren(){
        ArrayList<NodeFu> children = new ArrayList<NodeFu>();
        for (Node childNode : node.getChildNodes()){
            children.add(new NodeFu(childNode));
        }
        return children;
    }
} 

我假设你有更多的业务逻辑要添加到这个类中来操作 Node 本身的数据,否则 Node 类就足够了,你可以直接使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2011-04-22
    • 2021-04-04
    相关资源
    最近更新 更多