17_访问者模式
作者:互联网
一、组件
package com.study.visitor
/**
* 组件
*/
interface IComponent {
/**
* 获取价格
*/
fun getPrice(): Float
/**
* 访问者模式
*/
fun accept(v: IVisitor)
}
package com.study.visitor
class CPU : IComponent {
override fun getPrice(): Float = 90f
override fun accept(v: IVisitor) {
v.visitorCpu(this)
}
}
package com.study.visitor
class Screen : IComponent {
override fun getPrice(): Float = 30f
override fun accept(v: IVisitor) {
v.visitorScreen(this)
}
}
二、访问者
package com.study.visitor
interface IVisitor {
/**
* 访问CPU
*/
fun visitorCpu(cpu: CPU);
/**
* 访问Screen
*/
fun visitorScreen(screen: Screen);
}
package com.study.visitor
/**
* 用学生的身份设计
*/
class CompanyVisitor : IVisitor {
var totalPrice: Float = 0f
override fun visitorCpu(cpu: CPU) {
totalPrice += cpu.getPrice() * 0.9f
}
override fun visitorScreen(screen: Screen) {
totalPrice += screen.getPrice() * 0.8f
}
}
package com.study.visitor
/**
* 用公司的身份设计
*/
class CompanyVisitor : IVisitor {
var totalPrice: Float = 0f
override fun visitorCpu(cpu: CPU) {
totalPrice += cpu.getPrice() * 0.9f
}
override fun visitorScreen(screen: Screen) {
totalPrice += screen.getPrice() * 0.8f
}
}
三、主程序调用
package com.study.visitor
/**
*
* 定义和类型
定义:封装作用于某数据结构(如List/Set/Map)中的各元素的操作
可以在不改变各元素的类的前提下,定义作用于这些元素的各种操作
类型:行为型
适用场景
一个数据结构(如List/Set/Map)包含很多类型对象
数据结构和数据操作分离
优点
增加新的操作很容易,即增加一个新的访问者
缺点
增加新的数据结构很困难
具体元素变更比较麻烦
*/
fun main() {
val cpu = CPU()
val screen = Screen()
val studentVisitor = StudentVisitor()
val companyVisitor = CompanyVisitor()
//相同的组件对应不同的使用者产生出不同的价格
cpu.accept(studentVisitor)
screen.accept(studentVisitor)
println(studentVisitor.totalPrice)//81.0
cpu.accept(companyVisitor)
screen.accept(companyVisitor)
println(companyVisitor.totalPrice)//105.0
}
标签:totalPrice,17,visitor,screen,模式,override,fun,cpu,访问者 来源: https://blog.csdn.net/Duckdan/article/details/111408461