化妆网站模板,苏州营销型网站制作多少钱,百度搜索大全,中卫网站设计公司概念
将数据结构和操作分离#xff0c;使操作集合可以独立于数据结构变化。
角色介绍
Visitor#xff1a;抽象访问者#xff0c;为对象结构每个具体元素类声明一个访问操作。Element#xff1a;抽象元素#xff0c;定义一个accept方法ConcreteElement#xff1a;具体元…概念
将数据结构和操作分离使操作集合可以独立于数据结构变化。
角色介绍
Visitor抽象访问者为对象结构每个具体元素类声明一个访问操作。Element抽象元素定义一个accept方法ConcreteElement具体元素实现抽象元素的accept方法在accept方法中调用访问者的访问方法以完成对一个元素的操作。ConcreteVisitor具体访问者实现抽象访问者声明操作。ObjectStructure对象结构是一个集合用于存放元素对象并提供遍历内部元素的方法通常由List、Set、Map等集合类实现。
UML 代码实现
interface Visitor {fun visit(wine: Wine): Floatfun visit(pig: Pig): Floatfun visit(television: Television): Float
}
interface Goods {fun accept(visitor: Visitor): Floatfun account(): Float
}/*** 酒类*/
data class Wine(val count: Int,val price: Float
) : Goods {override fun accept(visitor: Visitor): Float {return visitor.visit(this)}override fun account(): Float {println(酒按瓶计价购买数量为${count}瓶单价为$price)return count * price}
}/*** 猪肉*/
data class Pig(val count: Int,val price: Float
) : Goods {override fun accept(visitor: Visitor): Float {return visitor.visit(this)}override fun account(): Float {println(猪肉按斤计价购买数量为${count}斤单价为$price)return count * price}
}/*** 电视*/
data class Television(val count: Int,val price: Float
) : Goods {override fun accept(visitor: Visitor): Float {return visitor.visit(this)}override fun account(): Float {println(电视按件台价购买数量为${count}台单价为$price)return count * price}
}
class VisitorImpl : Visitor {override fun visit(wine: Wine): Float {return wine.account()}override fun visit(pig: Pig): Float {return pig.account()}override fun visit(television: Television): Float {return television.account()}
}
class ShoppingList {val list ArrayListAny()fun add(any: Any) {list.add(any)}fun remove(any: Any) {list.remove(any)}
}
class AccountMachine {private var awt: Float 0ffun getAwt(list: MutableListAny): Float {val visitor: Visitor VisitorImpl()for (item in list) {awt (item as Goods).accept(visitor)}return awt}
}fun main() {val wine Wine(10, 5f)val pig Pig(2, 18f)val tv Television(1, 2300f)val shoppingList ShoppingList()shoppingList.add(wine)shoppingList.add(pig)shoppingList.add(tv)val accountMachine AccountMachine()val awt accountMachine.getAwt(shoppingList.list)println(总价$awt)
}优缺点
优点
分离操作和数据结构增加新操作更容易集中化操作 缺点增加新数据结构困难破坏封装
应用场景
适用于数据结构稳定操作易变对象的操作之间无关联的场景。
编译器文档转化比如markdown转html
总结
安卓开发中RecyclerViewAdapter是访问者对象而RecyclerView.ViewHolder是一个被访问者对象。在RecyclerView.Adapter中 我们需要实现 onCreateViewHolder()、onBindViewHolder()和getItemCount()等方法。这些方法被用于创建 ViewHolder对象、 绑定数据和获取列表项的数量等操作。在RecyclerView.ViewHolder中我们需要定义列表项的视图控件并在构造函数中将其初始化。 当Adapter对象需要绑定数据时ViewHolder对象会被创建并传递给Adapter对象的onBindViewHolder()方法中从而实现对列表项的访问和操作。 还有就是我们在写一些自定义Lint、Idea或者grade插件时也会见到访问者模式。
参考
访问者模式及其应用场景重新认识访问者模式从实践到本质 设计模式-访问者模式及应用 设计模式访问者Visitor模式