公共方法调用具有相同名称的私有方法 - 这种模式是什么?

时间:2014-09-30 12:13:39

标签: java design-patterns language-agnostic nomenclature

考虑来自Apache Commons StringUtils的代码:

public static String[] splitByCharacterType(final String str) {
    return splitByCharacterType(str, false);
}

private static String[] splitByCharacterType(final String str, final boolean camelCase) {
    // Some code...
}

这是一种非常常见的方法 - 公共方法将调用委托给具有相同名称但具有附加参数的私有方法。这个模式有没有名字?

2 个答案:

答案 0 :(得分:1)

更有可能是Facade design pattern。更为人所知的是为子系统中的一组接口提供统一的接口。但在这种情况下,我认为用于定义更高级别的实现,使子系统更易于使用。如您所见,SplitByCharacterType(final String str, final boolean camelCase)中的参数为两个,但只有一个通过splitByCharacterType(final String str)向外部世界公开。

隐藏实现细节也是Encapsulation的概念。因此,向其他用户提供他们需要知道/使用的东西,并且实际处理留给负责它的人。

答案 1 :(得分:1)

这是可选参数的实现。它用于提供API,如果你在没有可选参数的情况下调用它,它将继续使用sane(最好)默认值:

String.splitByCharacterType(text);            // splits the normal way
String.splitByCharacterType(text,CAMEL_CASE); // splits the alternative way

注意:我从未使用过Apache StringUtils,所以我上面的例子可能是错误的,但它仅用于说明用例。

在某些语言(如C ++)中,该语言直接提供语法来支持此用例:

char*[] splitByCharacterType(char* text, bool camelCase = 0) {
    // ...
}

在既没有函数重载也没有可选参数的其他语言中,可以使用varargs实现相同的用例。例如,在javascript中你可以这样做:

function splitByCharacterType (text) {
    var camelCase = false;
    if (arguments.length > 1 && arguments[1] == true) camelCase = true;

    // ...
}

在某些语言中,您可以调用少于预期参数数量的函数,并且未指定的参数将被赋予null或undefined的值。例如,在javascript中你也可以这样做:

function splitByCharacterType (text, camelCase) {
    if (camelCase != undefined) {
        // ..
    }
    else {
        // ..
    }
}

可选参数的思想与控制台应用程序的命令行参数基本相似。例如:

ls

上面的调用会生成您最常需要的输出,但您也可以这样做:

ls -l

在您需要更多信息时。