编辑:我意识到这个模式很像 currying ,一种函数程序员用来在调用之前指定函数参数的技术。这里的不同之处在于,我们在对象上使用柯里化(Currying)构造函数,而不是简单地柯里化(Currying)函数。
在几个项目中,我发现自己在使用这种奇怪的设计模式,但我找不到它的名字。它有名字吗?也许这只是不好的做法,你告诉我。
设计模式
有了这个模式,你会......
- 没有抽象方法的抽象基类(我们稍后再讨论)。
- 基类的许多“实现”。但是,这些实现将仅用于调用基类的构造函数。
Java 示例(假设场景)
我将定义一个假设场景以提供一些背景信息。
场景:
Bob 正在编写一个用于扫描源代码的小型 API。他希望能够检查注释是否在源代码中的给定索引处开始/结束。
这是 Bob 的代码。
1。抽象基类
public abstract class CommentDetector {
private final String startPattern;
private final String endPattern;
protected CommentDetector(String startPattern, String endPattern) {
this.startPattern = startPattern;
this.endPattern = endPattern;
}
public boolean commentStartsAt(int index, String sourceCode) {
// ...
}
public boolean commentEndsAt(int index, String sourceCode) {
// ...
}
}
你可能想知道为什么它是抽象的但没有抽象方法。这仅仅是因为 Bob 不希望您直接实例化它。 Bob 希望您编写 CommentDetector
的实现,然后实例化那个。这是 Bob 的两个实现...
2。一些实现
一个用于 Java 中的多行注释:
public class JavaMultiLineCommentDetector extends CommentDetector {
public JavaMultiLineCommentDetector() {
super("/*", "*/");
}
}
一个用于 Java 中的单行注释:
public class JavaSingleLineCommentDetector extends CommentDetector {
public JavaSingleLineCommentDetector() {
super("//", "\n");
}
}
Bob 为我们编写了这些实现,以便我们可以编写 new JavaMultiLineCommentDetector()
而不是 new CommentDetector("/*", "*/")
。
Bob 还鼓励您在需要时为其他语言编写自己的实现。
总结
感觉这种设计模式的目的是通过预定义构造函数调用来提高代码的可读性。
这种设计模式给代码一种多态的感觉(即使它可能/可能不是真正的多态)。
编写新的实现既快速又容易。
实现互不依赖,可以独立编译/部署。
这个设计模式有名字吗?
最佳答案
使用可扩展枚举模式(已在注释中注明)您还可以避免继承:
public interface CommentDelimiter {
String getStartPattern();
String getEndPattern();
}
public interface CommentDetector {
boolean commentStartsAt(int index, String sourceCode);
boolean commentEndsAt(int index, String sourceCode);
}
public enum CommentDetectors implements CommentDetector {
JAVA_MULTILINE(CommentDelimiters.JAVA_MULTILINE),
JAVA_SINGLELINE(CommentDelimiters.JAVA_SINGLELINE);
// ... store commentDelimiter
public boolean commentStartsAt(int index, String sourceCode) {
// ... using commentDelimiter.getStartPattern()
}
public boolean commentEndsAt(int index, String sourceCode) {
// ... using commentDelimiter.getEndPattern()
}
}
public enum CommentDelimiters implements CommentDelimiter {
JAVA_MULTILINE("/*", "*/"),
JAVA_SINGLELINE("//", "\n");
// ... store start, end
}
关于java - 这个设计模式有名字吗? (具有仅调用构造函数的实现的基类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39080792/