【发布时间】:2014-11-26 20:44:02
【问题描述】:
我已经在 C#(或 Java,无关紧要)中实现了一个简单的树结构,其中一切都围绕抽象类 Node 和它的一些子类。 Node 提供了与数学图论相关的方法和属性。例如 Node.Parent 引用父节点和 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 类的“图论方法”在给定的树上实现他自己的计算。
您知道什么是好的设计模式吗?
【问题讨论】:
-
称为子类
-
@zapl 子类化涉及继承,其中涉及静态地向类添加方法——这意味着在编译时。此外,继承不是一种设计模式——它是实现它们的一种手段。装饰器模式或许能解决问题
-
OO 设计发生在编译时,或者实际上在设计人员心目中之前。如果您真的想在运行时添加方法,那么您至少不在 OO 模式的世界中。
-
@zapl 你知道装饰器模式是什么吗?装饰器模式不会在编译时向类添加方法。装饰器模式允许我们在运行时向对象添加职责;很明显,不用说,添加的那些操作必须先编译。不过这些操作是动态添加的。
-
@zapl 你是对的。继承也可以解决这个问题。让我把它留在这句话上:“对于每一个复杂的问题,都有一个清晰、简单和错误的答案。” - H. L. Mencken
标签: java c# oop design-patterns