程序设计中的主要设计模式通常分为三大类,共23种:
1. 创建型模式(Creational Patterns)
-
单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
-
工厂方法模式(Factory Method):定义创建对象的接口,由子类决定实例化哪个类。
-
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。
-
建造者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。
-
原型模式(Prototype):通过复制现有对象来创建新对象。
2. 结构型模式(Structural Patterns)
-
适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。
-
桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。
-
组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。
-
装饰器模式(Decorator):动态地给对象添加职责,相比生成子类更为灵活。
-
外观模式(Facade):为子系统中的一组接口提供一个统一的接口。
-
享元模式(Flyweight):通过共享技术有效地支持大量细粒度对象。
-
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
3. 行为型模式(Behavioral Patterns)
-
责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者与接收者耦合。
-
命令模式(Command):将请求封装为对象,使你可以用不同的请求对客户进行参数化。
-
解释器模式(Interpreter):给定一个语言,定义其文法的一种表示,并定义一个解释器。
-
迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。
-
中介者模式(Mediator):定义一个中介对象来封装一系列对象之间的交互。
-
备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
-
观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知并自动更新。
-
状态模式(State):允许对象在其内部状态改变时改变其行为。
-
策略模式(Strategy):定义一系列算法,将它们封装起来,并使它们可以互相替换。
-
模板方法模式(Template Method):定义一个操作中的算法骨架,将一些步骤延迟到子类中。
-
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
4.迭代器模式(Iterator Pattern)简介
迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。通过迭代器模式,可以在不暴露集合内部结构的情况下,遍历集合中的元素。
核心思想:
- 迭代器:负责遍历集合中的元素,并提供访问元素的接口。
- 聚合对象:包含一组元素的集合,通常提供一个方法来获取迭代器。
优点:
- 简化集合接口:集合类不需要暴露其内部结构,只需提供一个迭代器即可。
- 支持多种遍历方式:可以为同一个集合提供不同的迭代器,支持不同的遍历方式。
- 解耦:迭代器模式将遍历逻辑与集合类分离,使得集合类和遍历逻辑可以独立变化。
缺点:
- 增加复杂性:对于简单的集合,引入迭代器可能会增加代码的复杂性。
- 性能开销:迭代器模式可能会引入额外的性能开销,尤其是在遍历大型集合时。
5.C# 迭代器模式演示代码
下面是一个简单的C#示例,展示了如何使用迭代器模式来遍历一个集合中的元素。
csharp
using System;
using System.Collections;
using System.Collections.Generic;// 迭代器接口
interface IIterator
{bool HasNext();object Next();
}// 聚合对象接口
interface IAggregate
{IIterator CreateIterator();
}// 具体聚合对象
class ConcreteAggregate : IAggregate
{private List<object> items = new List<object>();public void Add(object item){items.Add(item);}public IIterator CreateIterator(){return new ConcreteIterator(this);}public int Count{get { return items.Count; }}public object this[int index]{get { return items[index]; }set { items[index] = value; }}
}// 具体迭代器
class ConcreteIterator : IIterator
{private ConcreteAggregate aggregate;private int current = 0;public ConcreteIterator(ConcreteAggregate aggregate){this.aggregate = aggregate;}public bool HasNext(){return current < aggregate.Count;}public object Next(){if (HasNext()){return aggregate[current++];}else{throw new InvalidOperationException("No more elements");}}
}// 客户端代码
class Program
{static void Main(string[] args){// 创建聚合对象ConcreteAggregate aggregate = new ConcreteAggregate();aggregate.Add("Item 1");aggregate.Add("Item 2");aggregate.Add("Item 3");// 创建迭代器IIterator iterator = aggregate.CreateIterator();// 使用迭代器遍历集合while (iterator.HasNext()){Console.WriteLine(iterator.Next());}}
}
6.代码说明
-
IIterator 接口:定义了迭代器的接口,包含
HasNext
和Next
方法。HasNext
方法用于检查是否还有下一个元素,Next
方法用于获取下一个元素。 -
IAggregate 接口:定义了聚合对象的接口,包含一个
CreateIterator
方法,用于创建迭代器。 -
ConcreteAggregate 类:具体的聚合对象类,实现了
IAggregate
接口。它包含一个List<object>
来存储元素,并提供了CreateIterator
方法来创建具体的迭代器。 -
ConcreteIterator 类:具体的迭代器类,实现了
IIterator
接口。它包含对聚合对象的引用,并在HasNext
和Next
方法中实现遍历逻辑。 -
客户端代码:在
Main
方法中,创建了聚合对象并添加了一些元素,然后通过迭代器遍历集合中的元素。
7.运行结果
运行上述代码后,输出如下:
Item 1
Item 2
Item 3
8.总结
在这个示例中,迭代器模式通过引入 ConcreteIterator
来遍历 ConcreteAggregate
中的元素。聚合对象不需要暴露其内部结构,只需提供一个迭代器即可。这种方式使得集合类和遍历逻辑可以独立变化,提高了代码的灵活性和可维护性。