CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。
模式角色与结构:
实现代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CSharp.DesignPattern.IteratorPattern
{
class Program
{
static void Main(string[] args)
{
List<Object> objects = new List<Object>();
objects.Add("倚天剑");
objects.Add("屠龙刀");
objects.Add("断肠草");
objects.Add("葵花宝典");
objects.Add("四十二章经"); Aggregate list;
Iterator iterator; list = new ConcreteAggregate(objects); // 创建聚合对象
iterator = list.CreateIterator(); // 创建迭代器对象 Console.WriteLine("正向遍历:");
while(!iterator.IsLast()) {
Console.WriteLine(iterator.GetNextItem() + ",");
iterator.Next();
}
Console.WriteLine();
Console.WriteLine("-----------------------------");
Console.WriteLine("逆向遍历:");
while(!iterator.IsFirst()) {
Console.WriteLine(iterator.GetPreviousItem() + ",");
iterator.Previous();
} Console.ReadLine();
}
} // 抽象迭代器
interface Iterator
{
void Next(); // 指向下一个元素
void Previous(); // 移至上一个元素
Boolean IsLast(); // 判断是否为最后一个元素
Boolean IsFirst(); // 判断是否为第一个元素
Object GetNextItem(); // 获取下一个元素
Object GetPreviousItem(); // 获取上一个元素
} // 具体迭代器
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate; // 维持一个对具体聚合对象的引用,以便于访问存储在聚合对象中的数据
private List<Object> objects; private int cursor1; // 定义一个游标,用于记录当前访问位置
private int cursor2; public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
this.objects = aggregate.GetObjects(); // 获得集合对象 cursor1 = ; // 设置正向遍历游标的初始值
cursor2 = objects.Count - ; // 设置逆向遍历游标的初始值
} public void Next()
{
if (cursor1 < objects.Count)
{
cursor1++;
}
} public void Previous()
{
if (cursor2 > -)
{
cursor2--;
}
} public Boolean IsLast()
{
return (cursor1 == objects.Count);
} public Boolean IsFirst()
{
return (cursor2 == -);
} public Object GetNextItem()
{
return objects[cursor1];
} public Object GetPreviousItem()
{
return objects[cursor2];
}
} // 抽象聚合类
abstract class Aggregate
{
protected List<Object> objects = new List<Object>(); public Aggregate(List<Object> objects)
{
this.objects = objects;
} public void AddObject(Object obj) {
this.objects.Add(obj);
} public void RemoveObject(Object obj) {
this.objects.Remove(obj);
} public List<Object> GetObjects() {
return this.objects;
} // 声明创建迭代器对象的抽象工厂方法
public abstract Iterator CreateIterator();
} // 具体聚合类
class ConcreteAggregate : Aggregate
{
public ConcreteAggregate(List<Object> objects)
: base(objects)
{ } public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
}
}
CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)的更多相关文章
- Head First 设计模式读书笔记(1)-策略模式
一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...
- CSharp设计模式读书笔记(24):访问者模式(学习难度:★★★★☆,使用频率:★☆☆☆☆)
模式角色与结构: 示例代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- CSharp设计模式读书笔记(23):模板方法模式(学习难度:★★☆☆☆,使用频率:★★★☆☆)
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式角色与结构: 实现代码: using System; ...
- CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)
策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...
- CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)
模式角色与结构: 示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换.状态模式一定程度上违背开闭原则) using System; using System.Collectio ...
- CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)
中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,中介者模式又称为 ...
- CSharp设计模式读书笔记(15):命令模式(学习难度:★★★☆☆,使用频率:★★★★☆)
命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式,其别名为 ...
- CSharp设计模式读书笔记(14):职责链模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象 ...
- CSharp设计模式读书笔记(13):代理模式(学习难度:★★★☆☆,使用频率:★★★★☆)
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 模式角色与结构: 示例代码: using System; using System.Collections.Generi ...
随机推荐
- [LeetCode328]Odd Even Linked List
题目: Given a singly linked list, group all odd nodes together followed by the even nodes. Please note ...
- UVA580-Critical Mass
题目链接 题意:一个栈中仅仅能放入U和L,问存在连续3个以上U(危急组合)的个数为几个 思路:用总组合数-安全组合=危急组合.d[i]表示第i个位置以L结束的序列,所以就有d[i] = d[i - 1 ...
- ThinkPad E530 Fedora 20 无线上网问题
它一直在使用 Fedora 家庭 Linux. 但它自带的无线网卡驱动似下一些问题,通常,有时连接,有时你不能. 经常搜索不到的家用无线路由器. 因为家里有网线所以一直没有在意.没什么事就折腾了一下. ...
- Visual Studio 2013中c#语言规范5.0
文件位置 vs安装路径 "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\2052\CSharp ...
- ListView分页显示
出在:http://blog.csdn.net/tu_bingbing/article/details/13275107 当ListView要显示的数据过多时,为了更快的响应用户,这个 ...
- Solr/SolrCloud -error
状态 2014-08-20 10:46:22,356 INFO [coreZkRegister-1-thread-1] [org.apache.solr.cloud.ShardLeaderElecti ...
- JListDemo
Tips: (1)JList不能自动滚动,要想为列表框加上滚动条,必须将JList插入到一个JScrollPane中,然后将JScollPane而不是JList,插入到外围JPanel上 (2)Lis ...
- HDU2159 研发费用背包
主题链接:FATE 状态转移方程: dp[ren][num] =max(dp[ren-耐久值][num-1]+ 经验值,dp[ren][num]) dp表示:当前忍耐度ren下杀敌数为num的经验值 ...
- YUV摘要格式
始终保持视频数据YUV联系,因为基于其产品的组织不同的公司格不同的类型定义,派生出多种不同YUV格公式. 大体,YUV从在点的形式的像素组织中,有两个:1.planer状态.2.packet状态. p ...
- JDBC在getConnection之前为什么要调用Class.forName(转)
获取一个数据库连接的通用模板如下: String driver = "oracle.jdbc.OracleDriver"; String url = "jdbc:orac ...