2020-06-09 模板方法、迭代器和组合模式

模板方法:

特点:

模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现

基类主导一切,它拥有这个算法,知道这个算法的执行步骤,并保护这个算法,基类关在与算法本身步骤,而由子类提供完整实现

算法只存在于基类便于修改,算法中相同的部分由基类实现,将代码复用最大化

模板方法的抽象类可以定义具体方法(final)、抽象方法、钩子


注意:

模板方法应该被定义为final,以防止被子类覆盖

模板方法中具体某一步也可以定义为final,以防止被子类覆盖

默认不做事情的方法hook:

只有空或者默认的实现,子类可以自行决定是否覆盖

可以用作条件控制,影响抽象类中算法的流程

子类必须实现时使用抽象方法,是否实现可选时使用hook方法


好莱坞原则:别调用我们,我们会调用你

允许底层组件自己挂钩到系统上,但是什么时候使用怎么使用这些组建由高层组建决定

好莱坞原则vs依赖倒置原则

依赖倒置原则教我们避免使用具体的类,使用接口抽象编程

好莱坞原则运用在框架上,底层组件依靠挂钩参与运算,但又不会让高层组建依赖于底层组建

两者的目的均是解耦、避免依赖,创造有弹性的设计

迭代器:

特点:

将客户端与对象集合的存储方式解耦,即客户遍历对象时无需知道对象的具体存储方式

封装变化的部分,即多个不同的集合的不同遍历方式,创建迭代器封装遍历每个对象集合的过程

客户不需要知道具体对象集合是如何存储的,也无需知道迭代器是如何实现的,只需通过迭代器进行遍历

封装了遍历

解决了依赖具体对象集合存储方式和依赖具体对象类型的问题


注意:

对于不支持remove方法的迭代器,可以抛出java.lang.UnsupportedOperationException

迭代器不意味着有次序

可以实现previous()方法向前调取对象


外部迭代器vs内部迭代器:

外部:客户通过next()调取下一个元素

内部:客户将具体操作传给迭代器,具体的调取由迭代器自己控制


单一责任原则:一个类应该只有一个变化的原因

将一个责任指派给一个类

类的每个责任都有改变的潜在区域,超过一个责任意味着超过一个改变区域

为了便于维护,设计单一责任的高内聚类(设计成完成一个或一组相关性高的功能)


组合模式:

特点:

树形结构表示对象组合

忽略对象组合和对象个体之间的差别,即相同的操作既可以作用于对象组合,也可以作用与对象个体


注意:

因为继承方法中,有些方法只有对叶子节点有意义,而有些方法只对非叶子节点有意义,我们可以将基类的方法默认实现为抛出UnsupportedOperationException,如果方法无意义,则无需修改默认继承就可以了


透明性:

组合模式以单一责任原则换取了透明性

通过让组件接口同时包含叶子节点和非叶子节点的操作,客户可以将叶子节点和非叶子节点一视同仁,客户不知道节点的类别

换取透明性的同时我们同样失去了一些安全性

你可能感兴趣的:(2020-06-09 模板方法、迭代器和组合模式)