Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 什么是设计模式,还是反模式?_Oop_Design Patterns - Fatal编程技术网

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

Oop 什么是设计模式,还是反模式?,oop,design-patterns,Oop,Design Patterns,我将描述我正在尝试做的事情,希望有人能告诉我这是什么设计模式,或者指出更好的替代方案 我有一个方法来做一大堆复杂的事情,包括一个近似值。在没有近似的情况下计算结果是可能的,但这需要更多的工作 我想做的是找出一些与实现的内部工作相关的比较。我的想法是传入一个对象来完成额外的工作,并存储有关比较的信息 我想我想从: class Classifier(object): ... def classify(self, data): # Do some approximate

我将描述我正在尝试做的事情,希望有人能告诉我这是什么设计模式,或者指出更好的替代方案

我有一个方法来做一大堆复杂的事情,包括一个近似值。在没有近似的情况下计算结果是可能的,但这需要更多的工作

我想做的是找出一些与实现的内部工作相关的比较。我的想法是传入一个对象来完成额外的工作,并存储有关比较的信息

我想我想从:

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

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


那么,这是什么设计模式(如果有的话)?你能推荐一个替代方案吗?

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

我建议您在分类器上确实需要两种方法:分类/精确分类。分类返回近似结果;classify\u exact返回准确的结果。不要将TruthComparer作为参数传递,而是为TruthComparer提供两种分类,并让它完成它的工作

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

您可以使用。您可以定义
分类器
接口,并使用从
分类器
继承的
TruthComparerDecorator
。装饰器
truthcomarer
分类器
作为输入,使用该分类器实例计算近似值,然后运行
compute\u和\u store\u stats
方法。使用此模式,分类器不需要了解任何有关
truthcomarer
的信息。最后,一个
truthcomarer
是一个
分类器
,但是做了更多的事情。在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);
}

我确实遗漏了一些细节。这不是我想要比较的最终结果。我想收集有关计算中使用的一些中间值的统计信息。由近似分类器生成的中间值使用传递给方法的数据和一些其他实例成员,而这些数据对精确分类器不可用(因为它们不需要)。在这种情况下,我可能会让我的分类方法返回一个包含分类结果+额外数据的对象。然后我会把它交给TruthComparer。(不过,总而言之,您的设计并没有什么问题)
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);
}