一、简介
访问者模式(Visitor Pattern) 属于 行为型设计模式,看名字我就知道需要建立 访问者 和 被访问者 之间的关系。一般情况下,被访问者 都是不变的,比如说:书本、电脑等,而 访问者 可以是你或者其他人,这样就会导致一个现象:一千个人有一千个哈姆雷特;你拿电脑肝游戏,别人拿电脑生产力。
定义: 某个行为,因为不同的 访问者 产生不同的效果;访问者 也能够访问多种行为。
使用场景: 如果你需要对某个集合进行循环遍历并且因为元素有差异,需要先判断再进行操作,你就可以用 访问者模式;
实现要素:
- 分清楚 访问者 和 被访问者 的区别。
- 客户端必须创建 访问者 对象,并通过
接收方法
将其传递给 被访问者。
二、实现
// 被访问者
interface OS{
fun powerOnBy(visitor: Visitor) //被访问者开机,或者写成 fun visitedBy(visitor:Visitor)
}
// 访问者
interface Visitor{
fun useWindows(os:Windows)
fun useAndroid(os:Android)
}
然后根据 OS
接口,来实现不同的操作系统:
class Windows: OS{
override fun powerOnBy(visitor: Visitor){
visitor.useWindows(this)
}
fun work(){
println("生产力++")
}
}
class Android:OS{
override fun powerOnBy(visitor: Visitor) {
visitor.useAndroid(this)
}
fun playGame(){
println("游玩王者荣耀")
}
}
再实现访问者:
class Student : Visitor{
override fun useWindows(os: Windows) {
println("使用 Windows")
os.work()
}
override fun useAndroid(os: Android) {
println("使用 Android")
os.playGame()
}
}
在 main 方法中进行一顿操作:
fun main() {
val student = Student()
val android = Android()
val windows = Windows()
android.powerOnBy(student)
windows.powerOnBy(student)
}
控制台输出:
学生使用 Android
游玩王者荣耀
学生使用 Windows
生产力++
三、相关源码
访问者模式 并不是很常见的设计模式,所以本章没有源码分析,知道的小伙伴可以在评论区分享以下。
四、小结
访问者模式 作为 行为型设计模式,他提供了一种在生活中很常见的解耦方式,但是在代码中就不常见了……不管怎样,该设计模式说不定在某个场景下,就能够给你提供良好的解耦思路。