【Kotlin】委托模式

news2025/1/18 17:15:09

1 委托模式简介

        委托模式的类图结构如下。

        对应的 Kotlin 代码如下。

fun main() {
    var baseImpl = BaseImpl()
    var baseWrapper = BaseWrapper(baseImpl)
    baseWrapper.myFun1() // 打印: BaseImpl, myFun1
    baseWrapper.myFun2() // 打印: BaseImpl, myFun2
}

interface Base {
    fun myFun1()
    fun myFun2()
}

class BaseWrapper(var baseImpl: Base): Base {
    override fun myFun1() {
        baseImpl.myFun1()
    }

    override fun myFun2() {
        baseImpl.myFun2()
    }
}

class BaseImpl: Base {
    override fun myFun1() {
        println("BaseImpl, myFun1")
    }

    override fun myFun2() {
        println("BaseImpl, myFun2")
    }
}

2 类委托

        Kotlin 可以简化 BaseWrapper,简化后的代码如下。

fun main() {
    var baseImpl = BaseImpl()
    var baseWrapper = BaseWrapper(baseImpl)
    baseWrapper.myFun1() // 打印: BaseImpl, myFun1
    baseWrapper.myFun2() // 打印: BaseImpl, myFun2
}

interface Base {
    fun myFun1()
    fun myFun2()
}

class BaseWrapper(var baseImpl: Base): Base by baseImpl

class BaseImpl: Base {
    override fun myFun1() {
        println("BaseImpl, myFun1")
    }

    override fun myFun2() {
        println("BaseImpl, myFun2")
    }
}

3 属性委托

3.1 by T

import kotlin.reflect.KProperty

fun main() {
    var str: String by StringDelegate()
    str = "abc"
    println(str)
}

class StringDelegate {
    var value: String? = null

    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        println("getValue, thisRef=$thisRef, name=${property.name}, value=$value")
        return value ?: throw IllegalStateException("Property not initialized")
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("setValue, thisRef=$thisRef, name=${property.name}, value=$value")
        this.value = value
    }
}

        打印日志如下。

setValue, thisRef=null, name=str, value=ABC
getValue, thisRef=null, name=str, value=ABC
ABC

3.2 by lazy

fun main() {
    // lazy为生成的委托对象, 获取属性时会执行lazy里面的操作, 只支持val变量
    val str: String by lazy { "666" }
    println(str) // 打印: 666
}

3.3 by Delegates.observable

fun main() {
    var str: String by Delegates.observable("666") { prop, old, new ->
        println("prop=$prop, old=$old, new=$new")
    }
    println(str) // 666
    // prop=property str (Kotlin reflection is not available), old=666, new=888
    str = "888"
}

3.4 by ::T

fun main() {
    var example = Example("ABC")
    example.str2 = "DEF"
    // str1=DEF, str2=DEF
    println("str1=${example.str1}, str2=${example.str2}")
}

class Example(var str1: String) {
    var str2: String by ::str1
}

        说明:属性被委托后,str1 和 str2 同时修改。

3.5 by map

fun main() {
    var map: MutableMap<String, Any> = mutableMapOf(
        "name" to "Tom",
        "age" to 23,
        "id" to 1001
    )
    var user = User(map)
    println(user) // (Tom, 23, 1001)
}

class User(map: MutableMap<String, Any>) {
    var name: String by map
    var age: Int by map
    var id: Int by map

    override fun toString(): String = "($name, $age, $id)"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1572166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言第四十弹---预处理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 预处理 1、#和## 1.1 #运算符 1.2、##运算符 2、命名约定 3、#undef 4、命令行定义 5、条件编译 6、头文件的包含 6.1、头文件被包含的方式 6.1.1、本地…

docker从入门到熟悉

一、什么是docker&#xff1f; Docker是一个用于开发&#xff0c;交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。借助Docker&#xff0c;您可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的快速交付…

【数据结构】考研真题攻克与重点知识点剖析 - 第 4 篇:串

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

Pnpm + Turbo 搭建 Web Component Monorepo 组件库

技术选型 使用 Pnpm Turbo 搭建 Web Component Monorepo项目 stencil-component-ui 组件库 pnpm 作为包管理器Turborepo 作为构建系统Vitepress 管理文档 pnpm 技术 什么是 pnpm? 它有哪些优势&#xff1f; pnpm 跟 npm、yarn一样&#xff0c;都是用于管理Node包依赖的管…

硬件-1、体系架构

cpu 处理器 arm处理器的七种工作模式 arm寄存器 两张图是一样的&#xff0c;r0---r12是通用寄存器。其他寄存器可参考图一&#xff0c;cpu架构。 程序状态寄存器psr&#xff08;cpsr/spsr&#xff09; 程序异常处理 理解示例 当使用swi&#xff08;软中断指令&#xff09;指令…

Thinkphp5萤火商城B2C小程序源码

源码介绍 Thinkphp5萤火商城B2C小程序源码&#xff0c;是一款开源的电商系统&#xff0c;为中小企业提供最佳的新零售解决方案。采用稳定的MVC框架开发&#xff0c;执行效率、扩展性、稳定性值得信赖。 环境要求 Nginx/Apache/IIS PHP5.4 MySQL5.1 建议使用环境&#xff…

Alphabet考虑收购HubSpot:一个不太可能但未可知的大手笔动作

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

腾讯云轻量应用服务器是限制月流量吗?是的

腾讯云轻量应用服务器限制流量吗&#xff1f;是的&#xff0c;轻量应用服务器是限制月流量的。每台轻量应用服务器都是按套餐售卖点&#xff0c;套餐包括CPU内存、公网带宽、系统盘和月流量&#xff0c;腾讯云百科txybk.com以2核4G5M轻量应用服务器为例&#xff0c;限制500GB月…

selenium 遮罩层

之前写智联自动投简历 和boss自动投简历的时候 发现操作到上限之后就有个遮罩层&#xff0c;会在当前页面有个顶层得div 没办法获取下面的内容 # 假设遮罩层元素有一个特定的ID或者其他属性 没有id xpath 或者class 都可以mask_element WebDriverWait(driver, 10).until(EC.…

python 利用xpath 爬取一周天气

需求&#xff1a; 爬取 中国天气网指定城市一周的天气&#xff0c;以天津为例 实现&#xff1a; 1&#xff0c;先找到一周的数据位置。 divs html.xpath("//div[classhanml]") 2&#xff0c;再遍历每天。 trs div.xpath("./div/div[2]/table//tr[position…

UE4几个常用节点链接

UE4几个常用节点链接 2017-12-02 12:54 1. 流光材质(及uv平铺次数) 2. 跑九宫格 3.闪光3。1 粒子闪烁效果 4.图案重复5.平移扭曲 6.溶解 刀光的uv滚动图片源或采样节点属性里改成clamp无后期发光光晕anistropic 各向异性高光法线图 法线图叠加 blendangle orrectedNo…

STL中各类容器详细介绍

STL介绍 STL&#xff08;Standard Template Library&#xff09;&#xff0c;即标准模板库&#xff0c;是一个具有工业强度的&#xff0c;高效的C程序库。它被容纳于C标准程序库&#xff08;C Standard Library&#xff09;中&#xff0c;是ANSI/ISO C标准中最新的也是极具革命…

11-LINUX--信号

一.信号的基本概念 信号是系统响应某个条件而产生的事件&#xff0c;进程接收到信号会执行相应的操作。 与信号有关的系统调用在“signal.h”头文件中有声明 常见信号的值&#xff0c;及对应的功能说明&#xff1a; 信号的值在系统源码中的定义如下&#xff1a; 1. #define …

数学建模-最优包衣厚度终点判别法(主成分分析)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是viperrrrrrr~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff…

STL容器(3)

1,stack容器 1.1 基本概念 概念&#xff1a;stack是一种先进后出的数据结构&#xff0c;它只有一个出口 因此&#xff1a; 栈中只有顶端的元素才可以被使用&#xff0c;因此占不允许有遍历行为 栈中进入数据称为--入栈&#xff08;push) 栈中弹出数据称为--出栈&#xff08…

SYS-2722音频分析仪SYS2722

181/2461/8938产品概述&#xff1a; Audio Precision 2722 音频分析仪是 Audio Precision 屡获殊荣的 PC 控制音频分析仪的旗舰型号&#xff0c;长期以来一直是音频设备设计和测试的全球公认标准。功能齐全的 SYS-2722 提供了测试转换器技术最新进展所需的无与伦比的失真和噪声…

[机缘参悟-164] :心理架构分层模型、马斯洛需求层次模型、冰山素质模型、恋爱背叛层次模型大一统架构

目录 一、大一统架构 1.1 需求层次模型讲的是什么&#xff1f;need、requirment 1.2 人的心理分层模型是什么 1.3 冰山模型讲的什么&#xff1f; 二、婚姻的本质 2.1 婚姻是在不同层面上建立关联 2.2 恋爱的本质 2.3 婚姻是在不同层面上满足对方的需求 一、大一统架构 …

Java NIO Selector选择器源码分析

文章目录 前言Selector类结构Selector抽象类AbstractSelectorSelectorImplWindowsSelectorImpl三种SelectionKey集合 前言 Java NIO&#xff08;New I/O&#xff09;的Selector选择器是一个用于多路复用&#xff08;Multiplexing&#xff09;的I/O操作的关键组件。它允许一个单…

css实现更改checkbox的样式;更改checkbox选中后的背景色;更改checkbox选中后的icon

<input class"check-input" type"checkbox"> .check-input {width: 16px;height: 16px;} /* 设置默认的checkbox样式 */input.check-input[type"checkbox"] {-webkit-appearance: none; /* 移除默认样式 */border: 1px solid #999;outl…

IAR激活The generation feature is not of version 18解决办法

参考文章&#xff1a; IAR9.30以上版本安装、注册、新建工程和配置过程详细介绍 IAR9.32资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1xxMLTe8yLSmjIrzDc4-DAQ?pwdled0 提取码&#xff1a;led0 注意事项&#xff1a; 需要把licpatcher64a.exe在每个文件夹…