设计模式-迭代器模式和组合模式

1.迭代器模式完成的功能是和迭代器一样的,封装了对对象的顺序遍历,因为子类的对象集合的存储方式可能并不一致。但是存储的对象是一致的。

public classItem{
    .....//各种属性
}
public class Set1{
    item[] items;
    ...
    public Iterator createIterator(){
        return new ItemIterator(items);
    }
}
public class Set2{
    ArrayList items;
    ...
    public Iterator createIterator(){
        return  items.iterator();
    }
}
public class ItemIterator implements Iterator{
    Item[] items;
     int position;
    public ItemIterator(Item[] items)
    {
        this.items=items;
        position=0;
    }
    public Object next()
    {
        Item i=items[position];
        position=position+1;
        return i;
    }
    public boolean hasNext()
    {
        if (position>=items.lenght || items[position]==null)
            return false;
        else
            return true;
    }
}

通过这种方法,我们就可以通过自己定义的一个迭代器来访问数组,同时通过createIterator的方法来顺序遍历存储结构不一样的Set1和Set2中item对象。所以迭代器模式就是:

迭代器模式:提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露其内部的表示。

2.组合模式

组合模式其实就是整体与部分的一个关系,其实就是一个树形结构,根节点由他的子节点组合而成,而子节点又有自己的子节点来组合而成,所以组合模式的定义如下:

组合模式:允许你将对象组合成树形结构来表现“整体/部分”的层次结构,组合能让客户以一致的方法处理个别对象以及对象组合。

现在我们需要对组合模式下的对象这棵进行遍历怎么办?

public abstract class ItemComponent{
    ....//方法
    public void method1(){
    }
}
public classItem extends ItemComponent{
    .....//各种属性
    public void method1()
    {
        System.out.println("leaf");
    }
}
public class Set1 extends ItemComponent{
    item[] items;
    ...
    public Iterator Iterator(){
        return new ItemIterator(items);
    }
    public void method1()
    {
        System.out.println("not leaf");
        Iterator iterator=itemComponent.iterator();//重写
        while (iterator.hasNext())
        {
            ItemComponent t=(ItemComponent) iterator.next();
            t.method1();
        }
    }
}
public class Set2 extends ItemComponent{
    ArrayList items;
    ...
    public Iterator Iterator(){
        return  items.iterator();
    }
        public void method1()
    {
        System.out.println("not leaf");
        Iterator iterator=itemComponent.iterator();//重写
        while (iterator.hasNext())
        {
            ItemComponent t=(ItemComponent) iterator.next();
            t.method1();
        }
    }

}

上面这种方式是一种通过递归的方式来实现全部遍历的

public class ItemIterator implements Iterator{
    stack stack = new Stack();
    public ItemIterator(Iterator iter)
    {
        stack.push(iter);
    }

     public Object next()
    {
        if (hasNext()){
            Iterator iterator=(Iterator)stack.peek();
            ItemComponent t=(ItemComponent) iterator.next();
            if (t instanceof Set1)
            {
                stack.push(t.createIterator());
            }
            return t;
        }else{
            return null;
        }
    }
    public boolean hasNext()
    {
        if (stack.empty()){
            return false;
        }else{
            Iterator iterator=(Iterator) stack.peek();
            if (!iterator.hasNext()){
                stack.pop();
                return hasNext();
            }else {
                return true;
            }
        }
    }
}

现在定义的这种方式,是通过迭代器用栈模拟递归的一种方式。

3。设计模式-职责单一

单一责任: 一个类应该只有一个引起变化的原因。
时间: 2024-12-14 18:52:40

设计模式-迭代器模式和组合模式的相关文章

(38)23种设计模式研究之九【迭代器模式和组合模式】

一.定义 迭代器可以认为是一个指针,可以遍历容器的指针.迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器物件的内容迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址.迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器.然而迭代器有很多不同的能力,它可以把抽象容器和

迭代器模式和组合模式混用

迭代器模式和组合模式混用 前言 园子里说设计模式的文章算得上是海量了,所以本篇文章所用到的迭代器设计模式和组合模式不提供原理解析,有兴趣的朋友可以到一些前辈的设计模式文章上学学,很多很有意思的.在Head First 设计模式这本书中,也有说迭代和组合模式混用的方法,但是使用的语言是JAVA,实现起来比起C#差异还是不少.本人在做几个C#小项目的时候需要用到树形结构,也看到了Head First 设计模式中混用迭代器和组合模式的例子,觉得如果能用C#实现,以后无疑会带来很大的帮助.下面就记录下实

设计模式(七)组合模式Composite(结构型)

设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用的时候跟麻烦,而我们如何

JS设计模式(7)组合模式

什么是组合模式? 定义:1.将对象组合成树形结构以表示"部分-整体"的层次结构.2.组合模式使得用户对单个对象和组合对象的使用具有一致性.3.无须关心对象有多少层,调用时只需在根部进行调用; 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 何时使用: 1.您想表示对象的部分-整体层次结构(树形结构). 2.您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有

设计模式(8)组合模式

模式介绍 组合模式使得用户对单个对象和组合对象的使用具有一致性. 示例 我们使用一个汽水售卖机进行建模,这玩意会先让你选择品牌(可乐.芬达.雪碧),然后让你选择口味(樱桃味.香草味). 定义饮料类 /// <summary> /// Component abstract class /// </summary> public abstract class SoftDrink { public int Calories { get; set; } public List<Sof

12结构型模式之组合模式

概念 Composite模式也叫组合模式,是构造型的设计模式之一.通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树. 角色和职责 Component (树形结构的节点抽象) - 为所有的对象定义统一的接口(公共属性,行为等的定义) - 提供管理子节点对象的接口方法 - [可选]提供管理父节点对象的接口方法 Leaf (树形结构的叶节点) Component的实现子类 Composite(树形结构的枝节点) Component的实现子类 适用于: 单个对象和组合对象的使用具有一

迭代器模式,组合模式 -- 学习HeadFirst设计模式记录

迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 组合模式   :允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 单一原则:一个类应该只有一个引起变化的原因. 迭代器模式示例代码:   #include <iostream>#include <iomanip>  // cout格式控制#include <string>#include <vector&

设计模式08: Composite 组合模式(结构型模式)

Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface IBox { void Process(); } public class SingleBox:IBox { public void Process(){...} } public class ContainerBox:IBox { public void Process(){...} public

迭代器模式和组合模式

迭代器模式: 提供一种方法顺序访问聚合对象内的各个元素,而又不暴露其内部的表示 实现Iterator接口的hasNext()以及next()方法 组合模式: 允许你将对象组合成树形结构来表现"整体/部分"层次结构,组合能让客户以一致的方式处理个别对象以及对象组合