选代器模式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*

*/

namespace App_MYCS.HDL_SJMS.DDQMS
{
class my_DDQMS
{

public void dy()
{
ConcreteAggregate a = new ConcreteAggregate();

a[0] = "a";
a[1] = "b";

Iterator i = new ConcreteIterator(a);
object item = i.First();
while (!i.IsDone())//第一个乘客开始
{
Console.WriteLine("{0} 请买车票",i.CurrentItem());
i.Next();//下一个乘客
}
}

}

//定义得到开始对象 得到下一个对象 是否到结尾 当前对象等接口
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}

//
abstract class aggregate
{
public abstract Iterator createIterator();//创建选代器
}

//具体的选代器类 继承Iterator
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate; //定义一个具体聚集对象
private int current = 0;

public ConcreteIterator(ConcreteAggregate aggregate)//初始化时将具体的聚集对象传入
{
this.aggregate=aggregate;
}

public override object First()//得到聚焦的第一个对象
{
return aggregate[0];
}

public override object Next()//得到聚焦的下一个对象
{
object ret = null;
current++;

if (current < aggregate.Count)
{
ret = aggregate[current];
}
return ret;
}

public override bool IsDone()//判断当前是否遍历到结尾,到结尾返回true
{
return current >= aggregate.Count ? true : false;
}

public override object CurrentItem()//反回当前的聚集对象
{
return aggregate[current];
}
}

//具体的聚集类 继承Aggregate
class ConcreteAggregate:aggregate
{
private IList<object> items = new List<object>();//声明一个Ilist 泛型变量

public override Iterator createIterator()
{
return new ConcreteIterator(this);
}

public int Count //返回聚焦总个数
{
get { return items.Count; }
}

public object this[int index] //声明一个索引器
{
get { return items[index]; }
set { items.Insert(index, value); }
}
}

//-------------------------------------------------------------

//具体的选代器类 继承Iterator
class ConcreteIteratorDesc : Iterator
{
private ConcreteAggregate aggregate; //定义一个具体聚集对象
private int current = 0;

public ConcreteIteratorDesc(ConcreteAggregate aggregate)//初始化时将具体的聚集对象传入
{
this.aggregate = aggregate;
current = aggregate.Count - 1;
}

public override object First()//得到聚焦的第一个对象
{
return aggregate[aggregate.Count-1];
}

public override object Next()//得到聚焦的下一个对象
{
object ret = null;
current++;

if (current < aggregate.Count)
{
ret = aggregate[current];
}
return ret;
}

public override bool IsDone()//判断当前是否遍历到结尾,到结尾返回true
{
return current < 0 ? true : false;
}

public override object CurrentItem()//反回当前的聚集对象
{
return aggregate[current];
}
}

//-------------------------------------------------------------
//NET 选代器实现
interface Ieumerator
{
object Current//获取集合中的当前元素
{
get;
}
bool MoveNext();//将枚举推进到集合的下一个元素,方法返回值true表示选代器成功前进到集合的下一个元素,返回值false表示已经位于集合的末尾
void Reset();//恢复初始化指向的位置,该位置位于集合中第一个元素之前
}

interface Ienumerable
{
Ieumerator GetEnumerator();//返回一个循环访问集合的枚举数
}

}

时间: 2024-11-08 01:54:40

选代器模式的相关文章

JavaScript-迭代器模式

迭代器模式 顺序访问一个集合 使用者无需知道集合内部结构(封装) jQuery 示例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <p>jquery each</p> <p>jquery each</p>

设计模式-17-迭代器

简介:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 目的: 总结:使用Iterator避免二次迭代 组成: 1,举例 package com.design.q.iterator.standard; import java.util.Iterator; @SuppressWarnings("unchecked") public class ArrayList<E> implements Iterable<E>{ private E[

装饰器模式与代理模式比较

当有这样的业务需求的时候——要为写好的代码在目标代码之前或者之后添加部分操作时,此时最笨的方法就是直接在目标代码的前后加上我们需要的功能代码,但是这样违背了java封装的特性.更好一点的方法就是使用设计模式——代理模式,然而,装饰器模式也有同类的功能,那么着两种设计模式到底有什么区别呢?下面就分别来学习一下这两种设计模式. 装饰器模式类图如下: 该类图包括几个部分:一个接口(装饰器与需要被装饰的实体类都需要实现该接口,公用方法在该接口中定义),一个实现类,一个装饰器的接口,具体实现的装饰器. 在

枚举例题源码,反射例题源码,模板与装饰器模式例题源码

枚举例题:package cn.itcast_02; /* * 通过JDK5提供的枚举来做枚举类 */public enum Direction { FRONT, BEHIND, LEFT, RIGHT;} ---------------------------------------package cn.itcast_02; /* * 通过JDK5提供的枚举来做枚举类 */public enum Direction2 { FRONT("前"), BEHIND("后"

构建器模式

*构建器模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.类图如下: *product产品类:表示被构建器构建的复杂对象,包含多个部件. 1 //产品接口 示意性产品,所以没有任何方法 2 public interface Product{ 3 } *builder构建器接口:定义创建一个product对象所需要的各个部件的操作. 1 //生成器接口 2 public interface Builder{ 3 public void builderPart1();

【设计模式】之装饰器模式

为什么会有装饰模式? 装饰模式是为了解决继承强依赖性和出现大量子类不方便管理问题而出现的.   1. 概述 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数.装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法.修饰类必须和原来的类有相同的接口. 2. 模式中的角色 2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态

Decorator Pattern(装饰器模式)Demo1

一个简单的装饰器模式例子,用来体现直接查询,缓存查询,和过滤敏感词汇 1 import java.sql.Connection; 2 import java.sql.PreparedStatement; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.ArrayList; 6 import java.util.HashMap; 7 import java.util.List; 8 im

装饰器模式

定义:可以动态地添加修改类的功能 解析:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法.使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性. $canvas1 = new IMooc\Canvas();$canvas1->init();$canvas1->addDecorator(new \IMooc\ColorDrawDecorator('green'));$canvas1->addDecorato

装饰器模式及JAVA IO流例子★★★☆☆

一.什么是装饰模式 通过关联机制给类增加行为,其行为的扩展由修饰对象来决定: 二.补充说明 与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象: 或者说,继承是对类进行扩展,装饰模式是对对象进行扩展: 三.角色 抽象构件 具体构件 抽象装饰类 具体装饰类 说明:具体构件.抽象装饰类.具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件: 四.例子 例子说明: 画家接口Painter,为抽象构件,有两个方法,获取画家描述信息及绘画: