我有一个列表对象 - 节点列表。我想为用户提供“就地排序/订购”。用户可以将任何项目放在列表中的任何位置。是否存在一种设计模式,我将整个行为保持为一个包(作为对象或其他),并且在需要排序模式时可以暂时借用它?
我在Javascript中这样做。
我想到了装饰器,但我需要更改原始对象的属性。感觉不是正确的做法。 Decorator假设在不修改原始对象的情况下添加功能。
新细节:
我对我要做的事情有一个更好的比喻。让我们想想一个游戏角色。角色一直活到游戏中。角色可以担任某些角色。角色可以改变角色的属性,这是永久性的。角色可以一次或多次承担一个或多个角色。我如何构建程序中的“角色”和“角色”。
如果Role就像是角色的装饰者,那么修改角色的私人属性是不错的做法?还有别的吗?
答案 0 :(得分: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
属性可以保存原始对象。