2

我有一个列表对象 - 节点列表。我想向用户提供“就地排序/排序”。用户可以将任何项目放在列表中的任何位置。是否有一种设计模式,我将整个行为作为一个包(作为一个对象或其他任何东西)保存,并且可以在需要排序模式时临时借用它?

我在 Javascript 中执行此操作。

我想到了装饰器,但我需要更改原始对象的属性。感觉不是正确的方法。装饰器假设在不修改原始对象的情况下添加功能。

新细节:

对于我正在尝试做的事情,我有一个更好的类比。让我们考虑一个游戏角色。角色一直活到游戏存在。角色可以扮演一些角色。角色可以改变角色的属性,这是永久性的。角色可以一次或多次扮演一个或多个角色。我将如何构建程序中的“角色”和“角色”。

如果角色就像角色的装饰器,那么修改角色的私有属性而不是角色是一种好习惯吗?还有什么办法吗?

4

1 回答 1

0

作为一般方法,您可以使用链表。对于每个节点,您都希望保留它之后的节点。您还想保留第一个节点的引用。

  • 当用户将节点 A 移动到第一个节点和最后一个节点之间的某个位置时,找到节点 A 下方的节点(节点 B),然后将节点 B 设置为节点 A 的下一个节点。

  • 如果用户将一个节点移动到列表的末尾,则将下一个节点设置为null

  • 如果用户将节点移动到列表的开头,则更新第一个节点引用。

最后,当用户保存更改时,使用第一个节点的递归函数来创建项目的有序列表。

请注意,您实际上不需要更改原始对象。您的 Node 对象应该看起来很简单:

function Node(item, nextNode) {
    this.item = item;
    this.nextNode = nextNode;
}

Node.prototype.getItem = function () {
    return this.item;
};

Node.prototype.getNextNode = function () {
    return this.nextNode;
};

Node.prototype.setNextNode = function (node) {
    this.nextNode = node;
}

item属性可以保存您的原始对象。

于 2013-08-23T00:41:01.087 回答