前言
访问者模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
访问者模式
使用场景:用于将数据的操作和数据的结构解耦,数据的结构是稳定,但是数据的操作多变,这时候可以使用访问者模式。
理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了。在不改变原有数据结构的情况下,定义对这些数据结构的新操作。访问者非常的强大,可以在不破坏原有的类、对象的结构的情况下给这个类、对象扩展功能。不过它向外暴露了内部的细节,尽管如此,它也拥有了很优秀的扩展。
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)
}