17-迭代子(Iterator)模式Ruby实现

Posted 架构设计模式

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17-迭代子(Iterator)模式Ruby实现相关的知识,希望对你有一定的参考价值。

摘要:本文用一个实例场景描述Gof 23设计模式中的迭代子(Iterator)模式,并用Ruby程序代码给予实现,同时也给出实现代码的UML模型。

关键字Gof 23 设计模式 迭代子模式  Ruby

Iterator Pattern basedon Ruby

REN gang

Abstract:This paper gives a scene example to describe theuse of Iterator Pattern of Gof 23 Design Pattern, and achieves the example by Ruby,at the same time, gives the UML model of realization of the example.

Key word: Gof 23  Design Pattern  Iterator Pattern  Ruby

 

1. 标准定义

迭代子(Iterator)模式标准定义:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

2. 分析和说明

迭代子(Iterator)模式称迭代器模式,属于对象行为型模式。迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

迭代子(Iterator)模式结构如图1所示,其角色包括抽象迭代子(Iterator)角色、具体迭代子(Concrete Iterator)角色、聚集(Aggregate)角色、具体聚集(Concrete Aggregate)角色和客户端(Client)角色。

1 迭代子模式结构

    抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。

    具体迭代子(Concrete Iterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。

    聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。

    具体聚集(Concrete Aggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。

    客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。

3 应用场景举例

比如公司想统计一下所有员工中有硕士文凭的人数和他们的姓名。可以把所有员工都放到一个集合中,然后一个一个地询问是否是硕士,这样就可以获得有多少个硕士了。

在这里可以把Iterator抽象类理解为抽象迭代子(Iterator)角色。ImplementIterator类是具体迭代子(Concrete Iterator)角色。EmployeeCollection类是具体聚集(Concrete Aggregate)角色。其实现类图如图2所示。ImplementIterator类实现Iterator接口并关联EmployeeCollectionEmployee类聚合EmployeeCollection类,即EmployeeCollection包容多个Employee

2 迭代子模式结构类图

 

4Ruby的实现程序代码

Ruby程序实现主要包括Iterator抽象类,ImplementIterator类,EmployeeCollection类和Employee类等4个类。其关系如图2所示。下面分别列出这4个类的程序代码,最后列出测试代码并显示输出结果。

程序代码清单

 

 

#!/behavioralpatterns/iterator

 

class Employee

      

       def  initialize(name,ed)

         @employeeName = name

           @education = ed

     end 

      

       def  Employee(name ,ed )

              @employeeName  = name

           @education = ed

       end

      

       def  getEmployeeName

              @employeeName

       end

      

       def  setEmployeeName(employeeName)

              @employeeName  = employeeName;

       end

      

       def  getEducation

              @education

       end

      

       def  setEducation(education)

              @education  = education

       end

end

 

class EmployeeCollection

 

       @@employeeList  = Array.new

       @@employeeMax  = 0

      

       def  addEmployee(employee)

              @@employeeList<<  employee

              @@employeeMax  += 1

              self

       end

 

       def  getEmployee(i)             

              @@employeeList[i]

       end

 

       def  getEmployeeMax

              @@employeeMax

       end

 

       def  setEmployeeMax(employeeMax)

              @@employeeMax  = employeeMax

       end

end

 

class Iterator

      

       def  next

         nil

       end  

             

       def  previous

         nil

       end

end

 

class ImplementIterator < Iterator

 

     def initialize(collection)

         initizeIterator(collection)

     end   

      

       def  ImplementIterator (collection)

              initizeIterator(collection);

       end

 

       def  initizeIterator(collection)

              @employeeCollection  = collection

              @currentIndex  = collection.getEmployeeMax() - 1

       end

 

       def  next()

              if  @currentIndex == -1 

                 nil

              else

                  @employeeCollection.getEmployee(@currentIndex -= 1 )

              end

     end

end

 

 

# ————————main主程序应用————————

 

employee1 = Employee.new("小王", "学士")

employee2 = Employee.new("小张", "学士")

employee3 = Employee.new("小刘", "硕士")

employee4 = Employee.new("小李", "学士")

employee5 = Employee.new("小马", "硕士")

 

employeeCollection =  EmployeeCollection.new

 

employeeCollection.addEmployee(employee1).addEmployee(employee2)

employeeCollection.addEmployee(employee3).addEmployee(employee4)

employeeCollection.addEmployee(employee5)

 

iterator =  ImplementIterator.new(employeeCollection)

 

begin

       employee  = iterator.next

       if  employee != nil

                     if  employee.getEducation() =="硕士"                             

                            puts  employee.getEmployeeName()+";"

                     end

       end

end   while employee != nil

 

BEGIN {

    puts "———这是iterator的输出开始———"

}

 

END {

    puts "———这是iterator的输出结束———"

}

 

 

迭代子模式测试类输出结果如下所示:

———这是iterator的输出开始———

小刘;

小马;

———这是iterator的输出结束———

 

 

参考文献

[1] E.Gamma, R.Helm, R.Johnson, andVlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley,1995

[2] E.Gamma, R.Helm, R.Johnson, andVlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.20009

[3] (日)高桥征义,(日)后藤裕藏 著,何文斯 译,Ruby基础教程(第4版),北京:人民邮电出版社.2014.09

[4] 许勇 等编著,Ruby on Rails 程序设计 深入剖析与范例应用,北京:清华大学出版社.2013.07

[5] (美)梅茨 著,张雪平,彭晓东译,面向对象设计实践指南:Ruby语言描述,北京:人民邮电出版社.2014.01

[6] Ruby官方网站:www.ruby-lang.org

[7] Ruby教程 http://www.runoob.com/ruby/ruby-tutorial.html



以上是关于17-迭代子(Iterator)模式Ruby实现的主要内容,如果未能解决你的问题,请参考以下文章

17迭代器模式(Iterator Pattern)

尚硅谷设计模式学习(17)---[迭代器模式(Iterator Pattern)]

迭代子模式

Iterator(迭代器)

设计模式-17-迭代器

Java源码分析:深入探讨Iterator模式