我学会了,访问者模式

简介: 访问者模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

前言

访问者模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

访问者模式

使用场景:用于将数据的操作和数据的结构解耦,数据的结构是稳定,但是数据的操作多变,这时候可以使用访问者模式。

理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了。在不改变原有数据结构的情况下,定义对这些数据结构的新操作。访问者非常的强大,可以在不破坏原有的类、对象的结构的情况下给这个类、对象扩展功能。不过它向外暴露了内部的细节,尽管如此,它也拥有了很优秀的扩展。

namespace action_mode_07 {

    interface ITeacherVisitor {
        visit(student: IStudent): void;
    }

    interface IStudent {
        type: string
        accep(techer: ITeacherVisitor): void;
    }

    // 访问者:老师A
    class TecherA implements ITeacherVisitor {

        name: string

        constructor (name: string) {
            this.name = name
        }

        visit(student: IStudent): void {
            if (student.type === '好学生') {
                console.log(this.name + '很开心,和好学生的父母谈笑风生。')
            } else if (student.type === '坏学生') {
                console.log(this.name + '很尴尬,安慰坏学生的父母要多陪陪孩子。')
            } else {
                console.log(this.name + '正常的和学生父母进行交流。')
            }
        }
    }

    // 好学生
    class GoodStudent implements IStudent {

        name: string
        type: string
        
        constructor (name: string) {
            this.name = name
            this.type = '好学生'
        }

        accep(techer: ITeacherVisitor): void {
            techer.visit(this)
        }
    }

    // 坏学生
    class BadStudent implements IStudent {

        name: string
        type: string

        constructor (name: string) {

            this.name = name
            this.type = '坏学生'
        }

        accep(techer: ITeacherVisitor) {
            techer.visit(this)
        }
    }

    // 普通学生
    class NormalStudent implements IStudent {

        name: string
        type: string

        constructor (name: string) {

            this.name = name
            this.type = '普通学生'
        }

        accep(techer: ITeacherVisitor) {
            techer.visit(this)
        }

    }

    // 访问者A
    const techerA = new TecherA('女老师')

    const goodStudent = new GoodStudent('好学生-夏雪')
    const badStudent = new BadStudent('坏学生-刘星')
    const normalStudent = new NormalStudent('普通学生-夏雨')

    // 未改变数据结构,直接通过访问者扩展了行为
    goodStudent.accep(techerA)
    badStudent.accep(techerA)
    normalStudent.accep(techerA)

    // 再来一个
    class TecherB implements ITeacherVisitor {
        name: string

        constructor (name: string) {
            this.name = name
        }

        visit(student: IStudent): void {
            if (student.type === '好学生') {
                console.log(this.name + '很开心,和好学生的父母谈笑风生。')
            } else if (student.type === '坏学生') {
                console.log(this.name + '很开心,说坏学生很有天分,在数学方面很有前途。')
            } else {
                console.log(this.name + '很开心的和学生父母进行交流。')
            }
        }
    }

    // 访问者B
    const techerB = new TecherB('金牌老师')
    goodStudent.accep(techerB)
    badStudent.accep(techerB)
    normalStudent.accep(techerB)

}
目录
相关文章
|
27天前
|
设计模式 编译器 C#
访问者模式
访问者模式是一种行为型设计模式,用于将数据结构与其操作解耦。通过在不改变数据结构的前提下增加新的操作,访问者模式提供了一种灵活的方式来实现功能扩展。其关键特性包括分离操作、支持扩展和双分派机制。适用于需要对对象结构中的元素执行多种操作、频繁扩展操作以及不希望操作逻辑和数据结构耦合的场景。常见的使用案例包括编译器中的语法树、文件系统和游戏场景。优点是增加操作时无需修改数据结构,符合开闭原则;缺点是添加新的数据结构类型时需要修改所有访问者类,维护成本较高。
47 3
|
4月前
|
设计模式 缓存 算法
Java设计模式-访问者模式(22)
Java设计模式-访问者模式(22)
|
5月前
|
设计模式 Java
访问者模式问题之在不使用访问者模式的情况下,怎么在一个 SelectNode 类中实现 extractFunctions 方法
访问者模式问题之在不使用访问者模式的情况下,怎么在一个 SelectNode 类中实现 extractFunctions 方法
|
8月前
|
设计模式 Java 容器
聊聊Java设计模式-访问者模式
访问者模式(Visitor Pattern)指将作用域某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作。
67 3
聊聊Java设计模式-访问者模式
|
8月前
|
算法
行为型 访问者模式
行为型 访问者模式
64 0
|
设计模式 Java uml
深入Java设计模式之访问者模式
深入Java设计模式之访问者模式
75 0
|
设计模式 Java 关系型数据库
访问者模式解读
访问者模式解读
今天说说你不知道的访问者模式
今天说说你不知道的访问者模式
84 0
|
设计模式 程序员
访问者模式是啥?咋实现呀?
访问者模式是啥?咋实现呀?
|
设计模式 Java Spring
Java设计模式 ->访问者模式
Java设计模式 ->访问者模式
110 0