标签:index functions 反转 undo golang func 设计模式 data UndoIntSet
/*
UndoIntSet是IntSet的功能扩展,可以进行undo操作
通过委托和反转控制将IntSet的逻辑和Undo的逻辑分开
undo的功能由委托给functions,这样可以实现IntSet依赖functions,
*/
type undo []func()
func (u *undo) Add(f func()) {
*u = append(*u,f)
}
func (u *undo) Undo() error{
functions := *u
if len(functions)==0{
return errors.New("do not undo")
}
index := len(functions)-1
if f := functions[index];f!=nil{
f()
functions[index]=nil
}
*u = functions[:index]
return nil
}
type UndoIntSet struct {
data map[int]bool
functions undo
}
func (s *UndoIntSet) Add(i int) {
if s.data[i]{
return
}
s.data[i]=true
s.functions = append(s.functions, func() {
delete(s.data,i)
})
}
func (s *UndoIntSet) remove(i int) {
if !s.data[i]{
return
}
delete(s.data,i)
s.functions = append(s.functions, func() {
s.data[i]=true
})
}
func (s *UndoIntSet) undo() {
s.functions.Undo()
}
标签:index,functions,反转,undo,golang,func,设计模式,data,UndoIntSet 来源: https://www.cnblogs.com/1token/p/15933409.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。