美文网首页
2020-06-09 模板方法、迭代器和组合模式

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

作者: ShawnPanCn | 来源:发表于2020-06-09 22:15 被阅读0次

    模板方法:

    特点:

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

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

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

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

    注意:

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

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

    默认不做事情的方法hook:

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

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

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

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

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

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

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

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

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

    迭代器:

    特点:

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

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

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

    封装了遍历

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

    注意:

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

    迭代器不意味着有次序

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

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

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

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

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

    将一个责任指派给一个类

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

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

    组合模式:

    特点:

    树形结构表示对象组合

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

    注意:

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

    透明性:

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

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

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

    相关文章

      网友评论

          本文标题:2020-06-09 模板方法、迭代器和组合模式

          本文链接:https://www.haomeiwen.com/subject/lqhytktx.html