OO设计模式:如何动态添加方法?

杰姆·范丹

我用C#(或Java,没什么大不了)实现了一个简单的树结构,其中所有内容都围绕抽象类Node及其一些子类展开。Node提供与数学图论相关的方法和属性。例如,Node.Parent引用父Node,而Node.Children引用子节点

class Node {  
    Node Parent;  
    Node[] Children;

    void appendNode(Node node) { ... }
}  

我正在使用树执行计算。计算涉及很多递归,我还需要为每个节点存储中间值。对于每次计算,我都向Node类引入了其他属性和方法,例如

class Node {  
    Node Parent;  
    Node[] Children; 

    // Calculate weight
    int weight; // current weight
    void recalculateWeight() {
        // perform some heavily recursive stuff
        // involving Parent.recalculateWeight()
        // and update the value of the variable weight
    }

    int price; // current price 
    void recalculatePrice() {
        // perform some heavily recursive stuff
        // involving Parent.recalculatePrice()
        // and update the value of the variable price
    }

    void appendNode(Node node) {
        // ...
        recalculateWeight();
        recalculatePrice();
    }
} 

但是现在我不得不放弃这种方法,因为应该动态添加计算值,而无需更改Node类。动态意味着其他人应该能够仅依靠Node类的“图形理论方法”在给定的树上实现自己的计算。

您有什么主意吗?

dkatzel

这尖叫着访客模式。

interface Visitor{

    visit(Node node);

}

class Node{

   //...


   void accept(Visitor v){
       //feel free to change visit order to viist children first
       v.visit(this);
       for(Node child : children){
          v.visit(child);
       }

   }
}

然后,您可以使所有不同的计算成为不同的访问者。创建新的计算或遍历类型根本不会更改Node类。您只需创建一个新的Visitor实现。

class WeightVisitor implements Visitor{

   int weight = 0;

   void visit(Node n){
        weight += ...
   }

}

然后每次您要计算体重

WeightVisitor visitor = new WeightVisitor();

rootNode.accept(visitor);

int weight = visitor.getWeight();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OO设计模式:如何动态添加方法?

来自分类Dev

如何在python中设计类(oo模式帮助)

来自分类Dev

如何用OO /设计模式术语定义此代码示例?

来自分类Dev

购物车的OO设计模式

来自分类Dev

购物车的OO设计模式

来自分类Dev

如何(哪种设计模式)处理添加新字段?

来自分类Dev

如何选择设计模式

来自分类Dev

如何使用静态方法作为策略设计模式的默认参数?

来自分类Dev

如何使用静态方法作为策略设计模式的默认参数?

来自分类Dev

如何处理MVC设计模式中的附加方法

来自分类Dev

策略设计模式-停止方法

来自分类Dev

如何在OO Writer中添加图

来自分类Dev

这个设计模式如何称呼

来自分类Dev

如何与策略设计模式互动

来自分类Dev

如何实现工厂设计模式

来自分类Dev

工厂模式动态方法

来自分类Dev

OO设计问题

来自分类Dev

如何设计cassandra模式,以便以后可以轻松添加其他列?

来自分类Dev

如何设计cassandra模式,以便以后可以轻松添加其他列?

来自分类Dev

如何编写OO Javascript实现简单的类模式感到困惑

来自分类Dev

困惑于如何编写OO Javascript实现简单的类模式

来自分类Dev

设计模式:Java EE Web 方法必须遵循一系列内部方法,但如何呢?

来自分类Dev

如何添加设计模型?

来自分类Dev

iOS:使用Factory设计模式动态更改可访问属性?

来自分类Dev

动态报告生成器应使用哪种设计模式?

来自分类Dev

动态报告生成器应使用哪种设计模式?

来自分类Dev

是否有基于动态或基于功能的语言的设计模式

来自分类Dev

确定方法调用顺序的接口设计模式

来自分类Dev

寻找设计模式以减少虚拟方法的重载

Related 相关文章

热门标签

归档