模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板模式可以使得子类可以不改变一个算法的结构就可以重新定义改算法的某些特定的步骤。
当我们要完成在某一细节层次一致的一个过程或一系列步骤,单其个别步骤在更详细的层次上的实现可能不同时,我们通过开率用模板方法模式来处理。
模板模式是通过把不变行为搬到父类,去除子类中的重复代码来提现他的优势。模板模式提供了一个很好的代码复用平台。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
实例UML图:
代码实现:
/**
* @author Shuyu.Wang
* @package:com.shuyu.template
* @description:抽象模板
* @date 2018-11-17 22:56
**/
public abstract class AbstractClass {
public abstract void primitiveOperation1();
public abstract void primitiveOperation2();
public void templateMethod(){
primitiveOperation1();
primitiveOperation2();
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.template
* @description:实现类
* @date 2018-11-17 22:59
**/
@Slf4j
public class ConcreteClass extends AbstractClass {
@Override
public void primitiveOperation1() {
log.info("方法1实现");
}
@Override
public void primitiveOperation2() {
log.info("方法2实现");
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.template
* @description:
* @date 2018-11-17 23:03
**/
@Slf4j
public class ConcreteClass2 extends AbstractClass{
@Override
public void primitiveOperation1() {
log.info("类2方法1实现");
}
@Override
public void primitiveOperation2() {
log.info("类2方法2实现");
}
}
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class TemplateApplicationTests {
@Test
public void contextLoads() {
AbstractClass abstractClass=new ConcreteClass();
abstractClass.templateMethod();
abstractClass=new ConcreteClass2();
abstractClass.templateMethod();
}
}
运行结果如下:
2018-11-17 23:06:45.496 INFO 40376 --- [ main] com.shuyu.template.ConcreteClass : 方法1实现
2018-11-17 23:06:45.496 INFO 40376 --- [ main] com.shuyu.template.ConcreteClass : 方法2实现
2018-11-17 23:06:45.497 INFO 40376 --- [ main] com.shuyu.template.ConcreteClass2 : 类2方法1实现
2018-11-17 23:06:45.497 INFO 40376 --- [ main] com.shuyu.template.ConcreteClass2 : 类2方法2实现
代码github地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/template