【发布时间】:2016-12-29 01:54:07
【问题描述】:
编辑:我意识到这种模式很像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 的实现,然后实例化 that。这是 Bob 的两个实现...
2。一些实现
一个用于 Java 中的多行 cmets:
public class JavaMultiLineCommentDetector extends CommentDetector {
public JavaMultiLineCommentDetector() {
super("/*", "*/");
}
}
一个用于 Java 中的单行 cmets:
public class JavaSingleLineCommentDetector extends CommentDetector {
public JavaSingleLineCommentDetector() {
super("//", "\n");
}
}
Bob 为我们编写了这些实现,因此我们可以编写 new JavaMultiLineCommentDetector() 而不是 new CommentDetector("/*", "*/")。
如果需要,Bob 还鼓励您为其他语言编写自己的实现。
总结
感觉这种设计模式的目的是通过预定义构造函数调用来提高代码的可读性。
这种设计模式给代码带来了多态的感觉(尽管它可能真正是多态的)。
编写新的实现既快速又简单。
实现不相互依赖,可以独立编译/部署。
这个设计模式有名字吗?
【问题讨论】:
-
它不是以任何有意义的方式多态的:/ 似乎这种模式可以通过静态辅助方法同样好地实现。
-
或将其设为枚举
-
嗯...它也可能是一种反模式,可能会导致像
new CommentDetector("//", "\n") {};这样的代码(这会使客户端库膨胀) -
@BrandonIbbotson - 它是 - 它正在创建一个匿名类。
-
看起来意图是创建一个extensible enum。
CommentDetector将是枚举类。JavaMultiLineCommentDetector和JavaSingleLineCommentDetector将是枚举常量,并且客户端也可以扩展CommentDetector。
标签: java oop inheritance design-patterns nomenclature