oop – 什么设计模式,或反模式?

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

我有一个方法做一堆涉及近似的复杂的东西.可以在没有近似的情况下计算结果,但这涉及更多的工作.

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

我想我想要离开:

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)

我不想在分类方法中内联进行那些比较的原因是我不认为它适合那个方法或对象的工作来进行那些比较.

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

最佳答案 您可以使用
Decorator Pattern.您可以定义Classifier接口并使用继承自Classifier的TruthComparerDecorator.装饰器TruthComparer将分类器作为输入,使用此分类器实例计算近似值,然后运行compute_and_store_stats方法.使用此模式,分类器不需要了解有关TruthComparer的任何信息.最后,TruthComparer是一个分类器,但做了更多的事情.在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);
}
点赞