小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、迭代器模式
定义: 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式,其主要优点如下。
理解: 迭代器模式就是通过迭代器类来遍历聚合对象,将数据的存储和遍历解耦,又隐藏了聚合对象的内部细节。例如java的List、Map等都有iterator迭代器来遍历。迭代器模式包含4个角色,抽象聚合角色主要存储对象以及创建迭代器对象的接口;具体聚合角色实现抽象聚合类,返回一个迭代器实例;抽象迭代器角色定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法;具体迭代器角色实现抽象迭代器接口中所定义的方法,来完成对聚合对象的遍历,记录遍历的当前位置。
优点: 访问聚合对象可以不暴露其内部细节;可以为不同结构的聚合对象提供一个统一的接口;一个聚合对象可以实现多种遍历;增加新的聚合类比较方便,符合开闭原则。
缺点: 将对象数据的存储和遍历分离,增加聚合类的时候要增加新的迭代器类,可能会提供系统复杂性。
场景: 需要为聚合对象提供多种遍历方式时;需要遍历不同的结构的聚合对象时;需要隐藏聚合对象的内部细节时;
二、 中介者模式
定义: 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
理解: 中介者模式又叫调停模式,它是迪米特法则的典型应用。中介者模式公开一个统一的接口,系统的不同对象可以通过这个接口通信,增加一个中介者对象后,对象就通过这个中介者来通信,而不是互相引用,当有一个对象发生改变时,只需要通知中介者,而不用通知所有引用它的对象。例如MVC框架中,控制器就是模型和视图的中介者。中介者模式包含4个角色,抽象中介者角色是中介者的接口,定义了各同事之间交互需要的方法;具体中介者角色实现中介者接口,负责协调各个同事角色之间的交互关系;抽象同事类角色定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能;具体同事类角色是抽象同事类的实现者,实现具体业务,当需要与其他同事对象交互时,由中介者负责与其他同事的交互。
优点: 将对象一对多转变为一对一,提高灵活性,降低对象之间的耦合,易于复用,类之间各司其职,符合迪米特法则。
缺点: 当同事类越多时,中介者就会越臃肿,系统复杂度搞,如果中介者出了问题,整个系统就凉凉。
场景: 对象之间存在复杂的网状结构关系,进行复杂的通信时;需要创建一个运行于多个类之间的对象,又不想生成新的子类时。