自定义带计数器队列
2019-12-12 本文已影响0人
蓝不蓝编程
背景
产品需要在一个界面显示之前弹出两种不同类型的弹框,后期又希望每种弹框显示一定的次数后才不再出现.如先显示1次A弹框,再显示2次B弹框.
第1次进入X界面,出现A弹框;
第2次进入X界面,出现B弹框;
第3次进入X界面,出现B弹框;
分析
如果直接在X界面里写这些逻辑,会导致X界面代码复杂化,弹框和X界面耦合严重,需要采用一种设计方式,让代码隔离,并且便于后期扩展,如又增加一种弹框怎么办?
解决方案
自定义带计数器队列.
初始化后队列成员: A(1) B(2)
第1次进入X界面,出现A弹框,队列成员变成:B(2);
第2次进入X界面,出现B弹框,队列成员变成:B(1);
第3次进入X界面,出现B弹框,队列清空.
主要代码
import java.util.LinkedList
class CountQueue<T> {
private val queue = LinkedList<CountQueueItem<T>>()
fun add(item: T, count: Int) {
if (count > 0) {
queue.add(CountQueueItem(item, count))
}
}
fun next(): T? {
val countQueueItem = queue.peek()
return if (countQueueItem != null) {
if (countQueueItem.count <= 1) {
queue.remove(countQueueItem)
}
countQueueItem.reduceCount()
countQueueItem.item
} else {
null
}
}
}
class CountQueueItem<T> {
var item: T? = null
var count: Int = 0
constructor(item: T) {
CountQueueItem(item, 1)
}
constructor(item: T, count: Int) {
this.item = item
this.count = count
}
fun reduceCount() {
count--
}
}