我学会了,访问者模式

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

前言

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

访问者模式

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

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

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)

}
目录
相关文章
|
编译器 C语言 Windows
cryptopp使用Qt mingw编译,以及海思平台交叉编译
cryptopp使用Qt mingw编译,以及海思平台交叉编译
357 0
|
存储 人工智能 自然语言处理
社区供稿 | 开放开源!蚂蚁集团浙江大学联合发布开源大模型知识抽取框架OneKE
OneKE 是由蚂蚁集团和浙江大学联合研发的大模型知识抽取框架,具备中英文双语、多领域多任务的泛化知识抽取能力,并提供了完善的工具链支持。OneKE 以开源形式贡献给 OpenKG 开放知识图谱社区。
|
关系型数据库 MySQL
MySQL自增ID用完会怎样?
MySQL自增ID用完会怎样?
|
11月前
|
人工智能 自然语言处理 程序员
用通义灵码@workspace和@terminal做项目代码熟悉和新需求实现的体验
来和大家分享一下,我用通义灵码@workspace和@terminal做项目代码熟悉和新需求实现的体验。
554 2
|
安全 Java 应用服务中间件
Tomcat弱口令+后端getshell漏洞
Tomcat弱口令+后端getshell漏洞
252 6
|
搜索推荐 C# Windows
一款.NET开源、免费、实用的多功能原神工具箱(改善桌面端玩家的游戏体验)
一款.NET开源、免费、实用的多功能原神工具箱(改善桌面端玩家的游戏体验)
255 0
|
机器学习/深度学习 人工智能 Java
软件开发者必读!2024年30大趋势提前曝光!
软件是科技行业的基础。从智能手机到复杂的企业系统,软件是推动这些技术的核心。在探索数字时代的过程中,了解软件开发的趋势非常重要。人工智能、机器学习、物联网等技术的快速发展对软件开发行业产生了巨大影响。本文旨在通过30个数据汇总,帮助读者们初步了解2024年软件开发领域的新趋势。
|
存储 算法
图解Kmp算法——配图详解(超级详细)
图解Kmp算法——配图详解(超级详细)
|
虚拟化
VMware克隆虚拟机后修改MAC地址、UUID、IP和主机名
VMware克隆虚拟机后修改MAC地址、UUID、IP和主机名
586 0
VMware克隆虚拟机后修改MAC地址、UUID、IP和主机名
|
弹性计算 IDE Java
从零搭建Spring Boot的Hello World
本教程将使用IntelliJ IDEA搭建一个简单SpringBoot项目,在项目中运行一个Hello World请求示例,并部署到阿里云服务器ECS上。