当前位置: 首页 > news >正文

成都的企业网站建设公司做商务楼房型图网站

成都的企业网站建设公司,做商务楼房型图网站,企业培训考试系统app,最好的直播软件有哪些该设计模式适用于创建复杂对象#xff0c;该复杂对象通常是由各个部分的子对象用一定的算法或者步骤构成#xff0c;针对每个子对象内部算法和步骤通常是稳定的#xff0c;但是该复杂对象的确实由于不同的需求而选择使用不同的子对象进行组装。对于构建该复杂的对象#xf…该设计模式适用于创建复杂对象该复杂对象通常是由各个部分的子对象用一定的算法或者步骤构成针对每个子对象内部算法和步骤通常是稳定的但是该复杂对象的确实由于不同的需求而选择使用不同的子对象进行组装。对于构建该复杂的对象通常可以使用builder设计模式。而对于kotlin语言结合高阶函数所实现的建造者设计模式算是DSL代码分享的实践。 比如我们如果想要创建一个Server类 class Server() {var port: Intvar address: String... }但是考虑到创建该对象比较复杂该对象的成员比较多且每一个成员的最终取值需要一定的算法策略为了减少构造函数的参数我们采用为该类添加一个建造者类通过建造者类来创建该Server对象而不是直接new该对象为了在使用中我们直观感受到该建造者类是专门为Server类服务故我们将该建造者类声明为该Server的内部类。 class Server(val serverBuilder: ServerBuilder) {class ServerBuilder {private var port: Int 8080private var address: String fun port(init: ServerBuilder.() - Int) apply { port init() }fun address(init: ServerBuilder.() - String) apply { address init() }fun build(): Server Server(this)} }我们仔细观察下这个建造者类ServerBuilder因为我们是要该类帮我们最终构建Server类那么我们就要求Server Builder要包含Server应该包含的所有的成员port、address等且这些成员都要设置成可变的可重新被赋值的即var。 同时为这些成员都增加一个对应的方法方便从外部注入值。我们仔细观察下port和address方法以port方法为例address方法结构和port方法类似。 port方法的参数接收一个参数该参数是一个lambda表达式一个高阶函数该port的方法的返回值是apply的返回值而我们知道kotlin的apply方法一般是作用于一个对象的且最终的返回值就是这个对象很明显此处的apply方法省略了thisapply的返回值就是当前的ServerBuilder对象完成的写法应该是 this.apply {}其等价于 fun port(init: ServerBuilder.() - Int): ServerBuilder {init()return this }apply的内部则是将lambda的表达式的返回值赋值给了该ServerBuilder对象的port成员。我们再来看下port方法所接收的lambda表达式 ServerBuilder.() - Int注意看此处的ServerBuilder().是什么意思呢在kotlin中classname(). 常用于高阶函数中作为高阶函数的参数。 形如action: (Builder.() - Int) 表示的是Function literals with receiver这是一个方法该方法不接收任何参数该方法返回的是一个int并且该方法是由Builder对象触发。 其实按照如上的使用的时候Idea给我们的提示就可以看出通过将port方法的高阶函数定义为Builder.() - Int就相当于我们为port方法的上下文注入下this而该this就是当前的Builder对象。 最终使用的时候如下 val server Server.ServerBuilder().port {8080}.address { www.baidu.com}借助了apply方法我们可以实现链式调用因为port方法和address函数返回的都是builder对象但是我们观察这种写法还是不够DSL化为此我们给ServerBuilder添加一个构造方法 class ServerBuilder private constructor(){private var port: Int 8080private var address: String // 此处的this(), 表示次构造器要授权给主构造器constructor(init: ServerBuilder.() - Unit): this() { init()}fun port(init: () - Int) apply { port port2() }fun address(init: ServerBuilder.() - String) apply { address init() }fun build(): Server Server(this)}val server Server.ServerBuilder {}.port {8080}.address {www.baidu.com}也可以写成如下把port和address写入ServerBuilder的里面因为ServerBuilder的里面可以拿到this上线文故最终形态class Server private constructor(val port: Int,val address: String, ) {private constructor(builder: ServerBuilder): this(builder.port,builder.address)class ServerBuilder private constructor(){var port: Int 8080var address: String // 此处的this(), 表示次构造器要授权给主构造器constructor(init: ServerBuilder.() - Unit): this() { init()}fun port(init: () - Int) apply { port init() }fun address(init: ServerBuilder.() - String) apply { address init() }fun build(): Server Server(this)} }fun main() {val server Server.ServerBuilder {port {8080}address {www.baidu.com}}.build() }为了进一步DSL化也为了向外界屏蔽ServerBuilder对象我们可以给ServerBuilder添加静态方法 class Server private constructor(val port: Int,val address: String, ) {companion object {// inline fun build(block: ServerBuilder.() - Unit) Builder().apply(block).build()fun build(block: ServerBuilder.() - Unit) ServerBuilder {block()}.build()}private constructor(builder: ServerBuilder): this(builder.port,builder.address)class ServerBuilder private constructor(){var port: Int 8080var address: String // port方法的参数接收一个参数该参数是一个lambda表达式一个高阶函数该port的方法的返回值是//apply的返回值apply的返回值就是当前的ServerBuilder对象完成的写法应该是this.apply// apply的内部则是将lambda的表达式的返回值赋值给了该ServerBuilder对象的port成员// 此处的this(), 表示次构造器要授权给主构造器constructor(init: ServerBuilder.() - Unit): this() { init()}fun port(init: () - Int) apply { port init() }fun address(init: ServerBuilder.() - String) apply { address init() }fun build(): Server Server(this)} } //测试 fun main() {val server Server.build {port {8082}address {www.baidu.com}} }参考 https://stackoverflow.com/questions/44427382/what-does-mean-in-kotlin
http://www.dnsts.com.cn/news/202584.html

相关文章:

  • 精美的php个人网站源码推广图片模版
  • 商城网站哪个公司做的好处响应式网页模板制作
  • 建设网站公司那里好相关的热搜问题解决方案wordpress文章页面边栏
  • 潮阳网站建设公司免费游戏网页
  • 深圳便宜网站建设济南专业制作网站
  • 重庆网站建设找重庆万为做微商网站设计
  • 建设银行贵阳银行下载官方网站如何做淘宝网站
  • 做模具的网站wordpress 自定义面板
  • 成都网站建设详细内容广告公司名字起名大全
  • 那做网站协会网站建设计划
  • 最好的外贸网站建设wordpress水印
  • 网站 开发逻辑wordpress dx seo
  • wordpress 购物网站主题变身小说网址wordpress
  • 网站统计分析工具的主要功能石家庄网站建设企业
  • 网站建设费进项税金可以抵扣吗wordpress装修模板制作
  • 阿里网站搭建ps企业站网站做多大的
  • p2p网站建设小微金融wordpress联系方式
  • 网站建设系统哪家便宜些网站营销中常见问题
  • 营销型网站建站推广互动营销网站建设
  • 网站建设一意见赚钱链接网站
  • 农村电商网站设计与发展现状自适应网站dedecms代码
  • 网站没有备案是假的吗买医疗产品的网站建设
  • 垂直网站内容建设现在去甘肃会被隔离吗
  • 有人做网站推广吗中英双板网站模版
  • 网站建设云主机云服务器丰台石家庄网站建设
  • 订阅号做微网站需要认证吗怎么建自己的公众号
  • 网站系统下载镇江核酸检测最新通知
  • 标签化网站沧州网站建设的技术方案
  • 网站建设网页制作教程国产crm系统
  • 检测网站是否被挂黑链界首网站建设