模板方法:
特点:
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现
基类主导一切,它拥有这个算法,知道这个算法的执行步骤,并保护这个算法,基类关在与算法本身步骤,而由子类提供完整实现
算法只存在于基类便于修改,算法中相同的部分由基类实现,将代码复用最大化
模板方法的抽象类可以定义具体方法(final)、抽象方法、钩子
注意:
模板方法应该被定义为final,以防止被子类覆盖
模板方法中具体某一步也可以定义为final,以防止被子类覆盖
默认不做事情的方法hook:
只有空或者默认的实现,子类可以自行决定是否覆盖
可以用作条件控制,影响抽象类中算法的流程
子类必须实现时使用抽象方法,是否实现可选时使用hook方法
好莱坞原则:别调用我们,我们会调用你
允许底层组件自己挂钩到系统上,但是什么时候使用怎么使用这些组建由高层组建决定
好莱坞原则vs依赖倒置原则
依赖倒置原则教我们避免使用具体的类,使用接口抽象编程
好莱坞原则运用在框架上,底层组件依靠挂钩参与运算,但又不会让高层组建依赖于底层组建
两者的目的均是解耦、避免依赖,创造有弹性的设计
迭代器:
特点:
将客户端与对象集合的存储方式解耦,即客户遍历对象时无需知道对象的具体存储方式
封装变化的部分,即多个不同的集合的不同遍历方式,创建迭代器封装遍历每个对象集合的过程
客户不需要知道具体对象集合是如何存储的,也无需知道迭代器是如何实现的,只需通过迭代器进行遍历
封装了遍历
解决了依赖具体对象集合存储方式和依赖具体对象类型的问题
注意:
对于不支持remove方法的迭代器,可以抛出java.lang.UnsupportedOperationException
迭代器不意味着有次序
可以实现previous()方法向前调取对象
外部迭代器vs内部迭代器:
外部:客户通过next()调取下一个元素
内部:客户将具体操作传给迭代器,具体的调取由迭代器自己控制
单一责任原则:一个类应该只有一个变化的原因
将一个责任指派给一个类
类的每个责任都有改变的潜在区域,超过一个责任意味着超过一个改变区域
为了便于维护,设计单一责任的高内聚类(设计成完成一个或一组相关性高的功能)
组合模式:
特点:
树形结构表示对象组合
忽略对象组合和对象个体之间的差别,即相同的操作既可以作用于对象组合,也可以作用与对象个体
注意:
因为继承方法中,有些方法只有对叶子节点有意义,而有些方法只对非叶子节点有意义,我们可以将基类的方法默认实现为抛出UnsupportedOperationException,如果方法无意义,则无需修改默认继承就可以了
透明性:
组合模式以单一责任原则换取了透明性
通过让组件接口同时包含叶子节点和非叶子节点的操作,客户可以将叶子节点和非叶子节点一视同仁,客户不知道节点的类别
换取透明性的同时我们同样失去了一些安全性
网友评论