aiyoudiao aiyoudiao
  • JavaScript
  • Vue
  • React
  • 低代码
  • 线性系统
  • 暂未分类
  • LeetCode
  • 算法
  • 数据结构
  • 设计模式
  • Other
  • PMP
  • Office
  • 面试
  • Bash
  • 流年往事
  • 经验片段
  • 读书杂感
  • 归档
  • 分类
  • 标签
  • 简介
  • 收藏
  • 有趣
  • 文档

码二

扫微信二维码,认识一下码二吧😉。
  • JavaScript
  • Vue
  • React
  • 低代码
  • 线性系统
  • 暂未分类
  • LeetCode
  • 算法
  • 数据结构
  • 设计模式
  • Other
  • PMP
  • Office
  • 面试
  • Bash
  • 流年往事
  • 经验片段
  • 读书杂感
  • 归档
  • 分类
  • 标签
  • 简介
  • 收藏
  • 有趣
  • 文档
  • LeetCode

  • 算法

  • 数据结构

  • 设计模式

    • 浅聊设计理念
    • 谈一谈设计原则
    • 工厂方法模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
    • 单例模式
    • 桥接模式
    • 代理模式
    • 装饰器模式
    • 适配器模式
    • 享元模式
    • 组合模式
    • 外观模式
    • 观察者模式
    • 模板方法模式
    • 策略模式
    • 职责链模式
    • 状态模式
    • 迭代器模式
    • 访问者模式
      • 前言
      • 访问者模式
    • 备忘录模式
    • 命令模式
    • 解释器模式
    • 中介者模式
  • Other

  • vue3设计与实现

  • 算法与设计
  • 设计模式
aiyoudiao
2022-02-24

访问者模式

# 前言

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

# 访问者模式

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

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

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)

}
#设计模式
上次更新时间: 10年18月2023日 01时57分53秒
迭代器模式
备忘录模式

← 迭代器模式 备忘录模式 →

最近更新
01
01.数据结构导论一览.md
10-16
02
30.2023年06月04日.md
06-04
03
08.与测量相关.md
05-06
更多文章>
Theme by Vdoing | Copyright © 2017-2023 aiyoudiao 码二 备案号: 鄂ICP备2022002654号-1