什么设计模式,还是反模式?

时间:2010-10-22 19:59:45

标签: oop design-patterns

我将描述我正在尝试做什么,希望有人可以告诉我这是什么样的设计模式,或者指出一个更好的选择。

我有一种方法可以处理一系列涉及近似的复杂事物。 可以在没有近似的情况下计算结果,但这需要更多的工作。

我想要做的是与实现的内部工作相关的一些比较。我的想法是传入一个可以完成这项额外工作的对象并存储有关比较的信息。

我想我想来自:

class Classifier(object):
    ...
    def classify(self, data):
        # Do some approximate stuff with the data and other
        # instance members.

class TruthComparer(object):
    def compute_and_store_stats(self, data, accessory_data):
        # Do the exact computation, compare to the approximation,
        # and store it.

    def get_comparison_stats(self):
        # Return detailed and aggregate information about the
        # differences between the truth and the approximation.

class Classifier(object):
    ...
    def classify(self, data, truth_comparer=None):
        # Do some approximate stuff with the data and other
        # instance members.
        # Optionally, do exact stuff with the data and other
        # instance members, storing info about differences
        # between the exact computation and the approximation
        # in the truth_comparer
        if truth_comparer is not None:
            truth_comparer.compute_and_store_stats(data,
                                                   [self._index, self._model],
                                                   intermediate_approximation)

我不想在classify方法中进行内联比较的原因是我不认为它适合该方法或对象的工作来进行这些比较。

那么,这个设计模式是什么?你能建议一个替代方案吗?

2 个答案:

答案 0 :(得分:2)

您可以使用Decorator Pattern。您定义Classifier接口并使用从TruthComparerDecorator继承的Classifier。装饰器TruthComparer采用Classifier作为输入,使用此分类器实例计算近似值,然后运行compute_and_store_stats方法。使用此模式,分类器不需要了解TruthComparer的任何信息。最后,TruthComparerClassifier,但会做更多的事情。在Java中,这可能看起来像:

public interface Classifier {
    void classify(Data data);
}

public abstract class TruthComparer implements Classifier {
    private Classifier classifier;
    public TruthComparerDecorator(Classifier classifier) {
        this.classifier = classifier;
    }
    public void classify(Data data) {
        classifier.classify(data);
        computeAndStoreStats(data);
    }
    public abstract void computeAndStoreStats(Data data);
}

答案 1 :(得分:0)

我对您提议的更改的问题是,分类器请求计算和存储统计信息部分似乎不正确。分类器不应该真的关心它。理想情况下,它甚至不应该知道TruthComparer存在。

我建议你真的想要在分类器上使用两种方法:classify / classify_exact。分类返回近似结果; classify_exact返回确切的结果。不要将TruthComparer作为参数传递,而是给TruthComparer两个分类并让它做它的事情。

这样你就可以减少你的分类器必须处理的对象数量(较低的耦合),我认为这会让事情变得更加清晰。