Используйте подход «отдельный объект для информации о состоянии», потому что он не страдает от недостатков, присущих другим подходам, которые вы рассматриваете.Более того, главный недостаток модели «отдельный объект», заключающийся в том, что от пользователя требуется передать состояние каждому методу RuleTree, может быть легко исправлен.
Рассмотрим прокси для RuleTree.Я буду использовать Ruby в качестве работоспособного приближения для псевдокода:
class RuleTreeProxy
def initialize(ruleTree) # Constructor
@ruleTree = RuleTree
@state = RuleTreeState.new
end
def state
return @state
end
def applyStage1(data)
@rule_tree.applyStage1(@state, data)
end
def applyStage2(data)
@rule_tree.applyStage2(@state, data)
end
# etc.
end
@ обозначает переменную члена объекта.
Любой, кому нужно использовать RuleTree, создает RuleTreeProxy и вызываетвместо этого:
proxy = RuleTreeProxy.new(ruleTree)
proxy.applyStage1(data)
proxy.applyStage2(data)
...
Объект состояния содержит средства доступа для извлечения полезной информации об обработке, выполненной RuleTree:
matches = proxy.state.numberOfMatches
Если вам требуется, чтобы разные фазы могли выполняться в разных потокахзатем либо убедитесь, что никакие два потока не будут пытаться работать с экземпляром RuleTreeProxy одновременно, либо добавьте соответствующую синхронизацию в RuleTreeProxy.