byx*_*xor 5 java oop inheritance design-patterns nomenclature
编辑:我意识到这种模式感觉很像currying,这是一种功能程序员在调用之前用来指定函数参数的技术.这里的区别在于我们在对象上讨论构造函数而不是简单地使用函数.
在整个几个项目中,我发现自己使用了这个奇怪的设计模式,我找不到它的名字.它有名字吗?也许这只是不好的做法,你告诉我.
有了这种模式,你会......
我将定义一个假设的场景来提供一些上下文.
Bob正在编写一个用于扫描源代码的小API.他希望能够检查注释是否在源代码中的给定索引处开始/结束.
这是鲍勃的代码.
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) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
您可能想知道为什么它是抽象的但没有抽象方法.这只是因为Bob 不希望您直接实例化它.Bob希望你编写一个实现,CommentDetector然后实例化它.以下是Bob的两个实现......
一个用于Java中的多行注释:
public class JavaMultiLineCommentDetector extends CommentDetector {
public JavaMultiLineCommentDetector() {
super("/*", "*/");
}
}
Run Code Online (Sandbox Code Playgroud)
一个用于Java中的单行注释:
public class JavaSingleLineCommentDetector extends CommentDetector {
public JavaSingleLineCommentDetector() {
super("//", "\n");
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)