实现迭代器模式示例,添加任务结构体、迭代器接口及具体实现,增强代码可读性
This commit is contained in:
parent
cc215c9d70
commit
f579b1a5cc
|
|
@ -0,0 +1,101 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
/*
|
||||||
|
实例:
|
||||||
|
汤宝宝有一张TODO表,记录着自己想干的事情。
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 任务结构体 - 迭代器元素
|
||||||
|
type Todo struct {
|
||||||
|
content string
|
||||||
|
done bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// 迭代器接口
|
||||||
|
type Iterator interface {
|
||||||
|
First() *Todo
|
||||||
|
Next() *Todo
|
||||||
|
isDone() bool
|
||||||
|
CurrentItem() int
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体迭代器 - 汤宝宝的TODO表迭代器
|
||||||
|
type TodoListIterator struct {
|
||||||
|
todoList *TodoList
|
||||||
|
current int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TodoListIterator) First() *Todo {
|
||||||
|
t.current = 0
|
||||||
|
if len(t.todoList.todos) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return t.todoList.todos[t.current]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TodoListIterator) Next() *Todo {
|
||||||
|
t.current++
|
||||||
|
if t.isDone() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return t.todoList.todos[t.current]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TodoListIterator) isDone() bool {
|
||||||
|
return t.current >= len(t.todoList.todos)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TodoListIterator) CurrentItem() int {
|
||||||
|
if t.isDone() {
|
||||||
|
return len(t.todoList.todos)
|
||||||
|
}
|
||||||
|
return t.current + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// 集合接口
|
||||||
|
type Collection interface {
|
||||||
|
CreateIterator() Iterator
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体集合 - 汤宝宝的TODO表
|
||||||
|
type TodoList struct {
|
||||||
|
todos []*Todo
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TodoList) CreateIterator() Iterator {
|
||||||
|
return &TodoListIterator{
|
||||||
|
todoList: t,
|
||||||
|
current: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
fmt.Println("============= 迭代器模式 =============")
|
||||||
|
|
||||||
|
// 创建TODO表并添加任务
|
||||||
|
todoList := &TodoList{
|
||||||
|
todos: []*Todo{
|
||||||
|
{content: "学习Go语言", done: true},
|
||||||
|
{content: "完成设计模式作业", done: false},
|
||||||
|
{content: "锻炼身体", done: false},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建迭代器
|
||||||
|
iterator := todoList.CreateIterator()
|
||||||
|
|
||||||
|
// 使用迭代器遍历TODO表
|
||||||
|
for item := iterator.First(); !iterator.isDone(); item = iterator.Next() {
|
||||||
|
done := "已完成"
|
||||||
|
if !item.done {
|
||||||
|
done = "未完成"
|
||||||
|
}
|
||||||
|
fmt.Println("当前第", iterator.CurrentItem(), "项任务内容:", item.content, "是否完成:", done)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("=========== 迭代器模式结束 ===========")
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,105 @@
|
||||||
|
"""
|
||||||
|
实例:
|
||||||
|
汤宝宝有一张TODO表,记录着自己想干的事情。
|
||||||
|
"""
|
||||||
|
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
|
||||||
|
|
||||||
|
# 任务结构体 - 迭代器元素
|
||||||
|
class Todo:
|
||||||
|
content: str
|
||||||
|
done: bool
|
||||||
|
|
||||||
|
def __init__(self, content: str, done: bool = False):
|
||||||
|
self.content = content
|
||||||
|
self.done = done
|
||||||
|
|
||||||
|
|
||||||
|
# 集合接口
|
||||||
|
class Collection(ABC):
|
||||||
|
@abstractmethod
|
||||||
|
def CreateIterator(self) -> "Iterator":
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# 具体集合 - 汤宝宝的TODO表
|
||||||
|
class TodoList(Collection):
|
||||||
|
todos: list[Todo]
|
||||||
|
|
||||||
|
def __init__(self, todos: list[Todo]):
|
||||||
|
self.todos = todos
|
||||||
|
|
||||||
|
def CreateIterator(self) -> "Iterator":
|
||||||
|
return TodoListIterator(self)
|
||||||
|
|
||||||
|
|
||||||
|
# 迭代器接口
|
||||||
|
class Iterator(ABC):
|
||||||
|
@abstractmethod
|
||||||
|
def First(self) -> Todo:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def Next(self) -> Todo | None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def isDone(self) -> bool:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def CurrentItem(self) -> int:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# 具体迭代器 - 汤宝宝的TODO表迭代器
|
||||||
|
class TodoListIterator(Iterator):
|
||||||
|
def __init__(self, todo_list: "TodoList"):
|
||||||
|
self._todo_list = todo_list
|
||||||
|
self._current = 0
|
||||||
|
|
||||||
|
def First(self) -> Todo:
|
||||||
|
self._current = 0
|
||||||
|
return self._todo_list.todos[self._current]
|
||||||
|
|
||||||
|
def Next(self) -> Todo | None:
|
||||||
|
self._current += 1
|
||||||
|
if not self.isDone():
|
||||||
|
return self._todo_list.todos[self._current]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def isDone(self) -> bool:
|
||||||
|
return self._current >= len(self._todo_list.todos)
|
||||||
|
|
||||||
|
def CurrentItem(self) -> int:
|
||||||
|
if self.isDone():
|
||||||
|
return len(self._todo_list.todos)
|
||||||
|
return self._current + 1
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("============= 迭代器模式 =============")
|
||||||
|
|
||||||
|
# 创建TODO表并添加任务
|
||||||
|
todo_list = TodoList(
|
||||||
|
todos=[
|
||||||
|
Todo("学习Go语言", True),
|
||||||
|
Todo("完成设计模式作业", False),
|
||||||
|
Todo("锻炼身体", False),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
# 创建迭代器
|
||||||
|
iterator = todo_list.CreateIterator()
|
||||||
|
|
||||||
|
# 使用迭代器遍历TODO表
|
||||||
|
item = iterator.First()
|
||||||
|
while not iterator.isDone():
|
||||||
|
done = "已完成" if item and item.done else "未完成"
|
||||||
|
print(
|
||||||
|
f"当前第 {iterator.CurrentItem()} 项任务内容: {item.content if item else ''} 是否完成: {done}"
|
||||||
|
)
|
||||||
|
item = iterator.Next()
|
||||||
|
|
||||||
|
print("\n=========== 迭代器模式结束 ===========")
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
实例:
|
||||||
|
汤宝宝有一张TODO表,记录着自己想干的事情。
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 任务结构体 - 迭代器元素
|
||||||
|
interface Todo {
|
||||||
|
content: string;
|
||||||
|
done: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 迭代器接口
|
||||||
|
interface IIterator {
|
||||||
|
First(): Todo;
|
||||||
|
Next(): Todo;
|
||||||
|
isDone(): boolean;
|
||||||
|
CurrentItem(): number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体迭代器 - 汤宝宝的TODO表迭代器
|
||||||
|
|
||||||
|
class TodoListIterator implements IIterator {
|
||||||
|
todoList: TodoList;
|
||||||
|
current: number;
|
||||||
|
constructor(todoList: TodoList) {
|
||||||
|
this.todoList = todoList;
|
||||||
|
this.current = 0;
|
||||||
|
}
|
||||||
|
First(): Todo {
|
||||||
|
this.current = 0;
|
||||||
|
return this.todoList.todos[this.current];
|
||||||
|
}
|
||||||
|
Next(): Todo {
|
||||||
|
this.current += 1;
|
||||||
|
return this.todoList.todos[this.current];
|
||||||
|
}
|
||||||
|
isDone(): boolean {
|
||||||
|
return this.current >= this.todoList.todos.length;
|
||||||
|
}
|
||||||
|
CurrentItem(): number {
|
||||||
|
if (this.current < 0 || this.current >= this.todoList.todos.length) {
|
||||||
|
return this.todoList.todos.length;
|
||||||
|
}
|
||||||
|
return this.current + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 集合接口
|
||||||
|
interface ICollection {
|
||||||
|
createIterator(): IIterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体集合 - 汤宝宝的TODO表
|
||||||
|
class TodoList implements ICollection {
|
||||||
|
todos: Todo[];
|
||||||
|
constructor(todos: Todo[]) {
|
||||||
|
this.todos = todos;
|
||||||
|
}
|
||||||
|
|
||||||
|
createIterator(): IIterator {
|
||||||
|
return new TodoListIterator(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
console.log("============= 迭代器模式 =============");
|
||||||
|
|
||||||
|
// 创建TODO表并添加任务
|
||||||
|
const todoList = new TodoList([
|
||||||
|
{ content: "学习Go语言", done: true },
|
||||||
|
{ content: "完成设计模式作业", done: false },
|
||||||
|
{ content: "锻炼身体", done: false },
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 创建迭代器
|
||||||
|
const iterator = todoList.createIterator();
|
||||||
|
|
||||||
|
// 使用迭代器遍历TODO表
|
||||||
|
for (
|
||||||
|
let item = iterator.First();
|
||||||
|
!iterator.isDone();
|
||||||
|
item = iterator.Next()
|
||||||
|
) {
|
||||||
|
console.log(
|
||||||
|
`当前第 ${iterator.CurrentItem()} 项任务内容: ${
|
||||||
|
item ? item.content : ""
|
||||||
|
} 是否完成: ${item && item.done ? "已完成" : "未完成"}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("\n=========== 迭代器模式结束 ===========");
|
||||||
|
})();
|
||||||
Loading…
Reference in New Issue