其他分享
首页 > 其他分享> > 17_访问者模式

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