设计模式最大的意义在于方便交流, 把隐形知识清晰地表达出来, 而不在于编码路线图.
设计的关键从来都不是设计模式,而是设计原则。一个好的设计并不需要死套哪些设计模式的,最重要的是阐述好OOP的设计原则,尽可能做到开放封闭,奔着高内聚低耦合的目标而去。
模板方法模式
概述
所谓模板方法模式就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
优点
①模板方法模式通过把不变的行为搬移到父类,去除了子类中的重复代码。
②子类实现算法的某些细节,有助于算法的扩展。
③通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
场景
①多个子类有共有的方法,并且逻辑基本相同。
②重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
③重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为。
实例
1、 AQS 的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法来管理同步状态。
对于子类而言,它并没有太多的活要做,AQS 已经提供了大量的模板方法(独占式获取和释放同步状态、共享式获取和释放同步状态、
查询同步队列中的等待线程情况)来实现同步, 自定义子类使用 AQS 提供的模板方法,就可以实现自己的同步语义。
2、Spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
门面模式(外观模式)
概述
门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。 门面模式提供了一个高层次的接口,隐藏了系统的复杂性,使得子系统更易于使用。
结构
优点
- 松耦合
门面模式松散了客户端和子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。 - 简单易用
门面模式让系统更加简单易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。 - 更好的划分访问层次
通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。 把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。
缺点
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
实例
1、slf4j。slf4j只是一个日志标准,并不是日志系统的具体实现,只要所有代码都使用门面对象slf4j,我们就不需要关心其具体实现,最终所有地方使用一种具体实现即可,更换、维护都非常方便。
slf4j只做两件事情:
- 提供日志接口
- 提供获取具体日志对象的方法