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

来源:互联网 发布:linux rsysnc 编辑:程序博客网 时间:2024/05/21 11:23

设计模式之——迭代器模式,组合模式

  • 迭代器模式定义
    迭代器模式提供了一种方法顺序的访问一个聚合对象中的各个元素,而又不暴露其内部的表示。当我们有了一个统一的方法访问聚合对象中的每一个对象,我们就可以编写多态的代码和聚合搭配使用,迭代器模式把在元素之间游走的责任交给迭代器,而不是聚合对象,这可以使得聚合的接口和实现变得更加简洁,也可以使聚合更加专注在管理对象的集合上,而不用理会遍历的事情。

    Menu{
    Iterator createIterator();
    }
    DinerMenu implements Menu{
    List menuItems;
    Iterator createIterator(){
    return new DinnerMenuIterator (menuItems);
    }
    }
    Iterator{
    hasNext();
    next();
    remove();
    }
    DinnerMenuIterator implements Iterator{
    List menuItems;
    DinnerMenuIterator (List menuItems){
    this.menuItems = menuItems
    }
    hasNext(){…}
    next(){…}
    remove(){…}
    }
    Menu是聚合的共同接口,这种方式可以使得客户代码从集合对象的实现解耦,Iterator设施所有的迭代器都必须实现的接口,它包含一些方法,利用这些方法可以在集合元素之间游走,上面的例子中我们使用的是自己实现的接口你也可以使用java.util.Iterator接口,这是java中已经实现过的,DinerMenu 是一个具体的聚合,这个聚合持有一个集合对象,并提供了一个方法返回集合的迭代器,DinnerMenuIterator 是一个具体的迭代器,负责管理目前遍历的位置,每一个具体的聚合都要实例化一个具体的迭代器,用来遍历对象集合。
    在java中,实现Collection接口的集合对象都实现了iterator方法,例如ArrayList对象,他们都可以直接通过调用iterator方法返回迭代器,对于这些集合对象我们不需要再为其创建特有的迭代器。

  • 编程原则
    单一原则,一个类应该只有一个引起变化的原因,类的每个责任都有改变的潜在区域,超过一个责任意味着超过一个改变的区域,我们要避免类内的改变,因为代码的修改会造成很多潜在的错误,如果一个类有两个改变的原因,这将会使得该类的变化率上升,潜在的错误也会随之提升。

  • 组合模式定义
    组合模式允许你将对象组合成树形结构来表现整体/部分层次结构,树里包含了组合以及个别对象,组合能让客户以一致的方式处理个别对象和对象组合。我们能够把相同的操作应用到组合和个别对象上,换句话说,在大多数情况下我们可以忽略对象组合和个别对象之间的差异。

    Component{
    operation();
    add(Component c){…}
    remove(Component c){…}
    getChild(int){…}
    }

    Leaf extendsComponent{
    operation(){…}
    }
    Composite extends Component{
    operation(){…}
    add(Component c){…}
    remove(Component c){…}
    getChild(int){…}
    }
    Component为组合中的所有对象定义一个接口,无论是组合还是叶节点,Component可以为add,remove,getChild和operation提供一些默认的行为,叶节点(Leaf)继承了Component中的所有方法,但是对于add,remove,getChild三个方法来说,对于叶节点没有任何意义,Composite定义了组件的行为,它里面还包含有子节点,它也实现了Component的所有方法,正如叶节点一般,也有一部分方法对于它来说是无意义的。
    我们可以通过在基类中实现组件中方法的默认实现,然后在叶节点和组合中按需求重写对自己有意义的方法来达到他们统一操作的要求,比如说在基类方法中都只抛出UnsupportedOperationException,当子类调用对自己无意义的方法时抛出异常。

原创粉丝点击