模板方法就是将不同类之间的相同逻辑抽出来然后放在抽象的父类里面的模板方法,子类都去实现父类并重写抽象方法去写各自的逻辑。
Before:
可以看到程序员,学生,老师,各自的day方法有相同的行为(逻辑)。可以考虑使用模板方法对其改造
After:
测试类:
可以看到这样就减少了重复的代码,而且还可以支持横向拓展,符合开闭原则。接下来开下UML类图
JDK模板方法的体现:
最经典的就是AbstractQueuedSynchronizer(简称AQS)里面的 acquire方法,该方法的子类实现类有尝非公平或公平的方式去获取锁
模板方法是一个非常简单的设计模式,在开源框架jdk spring mybatis都运用到了模板方法。
总结下模板方法模式:
优点:
1、封装不变的部分,扩展可变的部分
2、提取公共代码,便于维护
3、行为由父类控制,子类实现
缺点:
1、每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大
使用场景:
1、有多个子类共有的方法,且逻辑相同
2、重要的、复杂的方法,可以考虑作为模板方法
注意事项:为防止恶意操作,一般模板方法都加上 final 关键词