利用迭代器,适配器模式实现统一数据访问接口
时间: 2023-05-24 22:01:13 浏览: 57
可以实现一个通用的迭代器类,用于遍历不同类型的数据结构,而不必考虑其内部结构。通过适配器模式,将数据结构的访问接口适配到通用的迭代器类上。
下面是一个示例代码,演示如何实现一个通用的迭代器类和几个适配器:
```lua
-- 通用的迭代器类
local Iterator = {}
function Iterator:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function Iterator:hasNext()
error('Not implemented')
end
function Iterator:next()
error('Not implemented')
end
-- 数组迭代器适配器
local ArrayIterator = Iterator:new()
function ArrayIterator:new(arr)
return Iterator.new(self, {arr = arr, idx = 1})
end
function ArrayIterator:hasNext()
return self.idx <= #self.arr
end
function ArrayIterator:next()
local val = self.arr[self.idx]
self.idx = self.idx + 1
return val
end
-- 表迭代器适配器
local TableIterator = Iterator:new()
function TableIterator:new(tbl)
local keys = {}
for k, _ in pairs(tbl) do
table.insert(keys, k)
end
return Iterator.new(self, {tbl = tbl, keys = keys, idx = 1})
end
function TableIterator:hasNext()
return self.idx <= #self.keys
end
function TableIterator:next()
local key = self.keys[self.idx]
local val = self.tbl[key]
self.idx = self.idx + 1
return key, val
end
```
这个代码定义了一个通用的迭代器类 `Iterator`,同时提供了两个适配器 `ArrayIterator` 和 `TableIterator`,分别用于适配数组和表两种数据结构的访问接口。
使用这些适配器,我们可以轻松地遍历数组和表:
```lua
local arr = {1, 2, 3}
local iter = ArrayIterator:new(arr)
while iter:hasNext() do
print(iter:next())
end
local tbl = {a = 1, b = 2, c = 3}
local iter = TableIterator:new(tbl)
while iter:hasNext() do
local key, val = iter:next()
print(key, val)
end
```
输出结果:
```text
1
2
3
a 1
b 2
c 3
```