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
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值