设计模式篇(十)——访问者模式

一、简介

访问者模式(Visitor Pattern) 属于 行为型设计模式,看名字我就知道需要建立 访问者被访问者 之间的关系。一般情况下,被访问者 都是不变的,比如说:书本、电脑等,而 访问者 可以是你或者其他人,这样就会导致一个现象:一千个人有一千个哈姆雷特;你拿电脑肝游戏,别人拿电脑生产力。

定义: 某个行为,因为不同的 访问者 产生不同的效果;访问者 也能够访问多种行为。

使用场景: 如果你需要对某个集合进行循环遍历并且因为元素有差异,需要先判断再进行操作,你就可以用 访问者模式

实现要素:

  1. 分清楚 访问者被访问者 的区别。
  2. 客户端必须创建 访问者 对象,并通过 接收方法 将其传递给 被访问者

二、实现

//	被访问者
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
生产力++

三、相关源码

访问者模式 并不是很常见的设计模式,所以本章没有源码分析,知道的小伙伴可以在评论区分享以下。

四、小结

访问者模式 作为 行为型设计模式,他提供了一种在生活中很常见的解耦方式,但是在代码中就不常见了……不管怎样,该设计模式说不定在某个场景下,就能够给你提供良好的解耦思路。

猜你喜欢

转载自blog.csdn.net/catzifeng/article/details/106932738