@author javakam
访问者模式
访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。
访问者模式结构 UML
访问者和双分派
示例代码
Java 程序库代码中该模式的一些示例:
-
javax.lang.model.element.AnnotationValue
和AnnotationValueVisitor
-
javax.lang.model.element.Element
和ElementVisitor
-
javax.lang.model.type.TypeMirror
和TypeVisitor
-
java.nio.file.FileVisitor
和SimpleFileVisitor
-
javax.faces.component.visit.VisitContext
和VisitCallback
看下
ElementVisitor
的源码:
public interface ElementVisitor<R, P> {
//访问元素
R visit(Element var1, P var2);
default R visit(Element e) {
return this.visit(e, (Object)null);
}
//访问包元素
R visitPackage(PackageElement var1, P var2);
//访问一个类型元素
R visitType(TypeElement var1, P var2);
//访问一个变量类型
R visitVariable(VariableElement var1, P var2);
//访问一个可执行的元素
R visitExecutable(ExecutableElement var1, P var2);
//访问一个参数元素
R visitTypeParameter(TypeParameterElement var1, P var2);
//处理未知的元素类型 , Java 为后续扩展预留的接口
//例如后续元素类型增加了, 那么通过这个接口就可以处理上述没有声明的类型
R visitUnknown(Element var1, P var2);
default R visitModule(ModuleElement e, P p) {
return this.visitUnknown(e, p);
}
}
Android 程序示例:
APT
中的 AbstractProcessor.process()
, 而使用APT
的框架有Butterknife
,Retrofit
,Dagger2
等。
模板方法模式
当你只希望客户端扩展某个特定算法步骤, 而不是整个算法或其结构时, 可使用模板方法模式。
Java 程序库中模版方法的示例:
-
java.io.InputStream
、java.io.OutputStream
、java.io.Reader
和java.io.Writer
的所有非抽象方法。 -
java.util.AbstractList
、java.util.AbstractSet
和java.util.AbstractMap
的所有非抽象方法。 -
javax.servlet.http.HttpServlet
, 所有默认发送 HTTP 405 “方法不允许” 错误响应的doXXX()
方法。 你可随时对其进行重写。
识别方式: 模版方法可以通过行为方法来识别, 该方法已有一个在基类中定义的 “默认” 行为。
参考:
- Refactoring.Guru
- 《Android源码设计模式解析与实战》
- 掘金 👉 https://juejin.im/post/5ebe33335188256d5952500c & https://juejin.im/post/5ec1dee45188256d877dc710