调用时像下面这样
Receiver r = new Receiver();Command c = new ConcreteCommand(r);
Invoker i = new Invoker();
i.SetCommand(c);
i.ExecuteCommand();
命令模式可以比较容易设计成命令队列,方便记录日志,支持撤销重做
5、Iterator 迭代器迭代器提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。就是把元素之间的遍历游走的责任交给迭代器,而不是集合对象本身,分离了集合对象的遍历行为,这样不暴露集合内部结构,又可让外部访问集合内部数据。
核心就是定义一个有Next,CurrentItem等方法的Iterator迭代接口,然后在子类具体迭代器ConcreateIterator类(可以实现多个迭代方式)中定义一个具体的聚集对象,然后遍历迭代器的Next方法遍历聚集对象内部数据。
在dotNET框架中已经准备好了相关接口,只需要去实现去就好。
IEumerator支持对非泛型集合的简单迭代接口,就和上面Iterator一样
{
object? Current { get; }
bool MoveNext();
void Reset();
}
常用的foeach遍历,编译器也是转化为了IEnumerator遍历。因为太常用,高级语言都进行了封装,自己也就不常用了。
6、Mediator 中介者中介者模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。就是提供一个中介类,处理不同类之间的通信。
面向抽象编程要求我们类应该依赖于抽象
核心就是定义中介者关联不同的需要通信的类,通信类内部也需要关联具体中介者。通信类发送信息时实际已经通过中介者来转发。
我们看下核心的具体中介者和通信者以及客户端调用实例
中介者模式将原来网状的结构变成星状结构,所以中介者可能会很庞大。一般应用在一组对象已定义良好但是复杂的方式进行通信的场合。
7、Memento备忘录备忘录模式保存一个对象的某个状态,以便在适当的时候恢复对象。很多时候我们需要记录一个对象的内部状态,这样可以让用户去恢复。像玩魔塔游戏存进度一样。
结构图中Originator发起人负责创建一个备忘录,保存备忘录的内部数据。Memento备忘录包含要备份的数据,Caretaker管理者得到或设置备忘录。