1、定义
模板方法模式(Template Method Pattern):定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法是一种类行为型模式。
2、UML类图
从模型图来看,模板方法模式很简单,但是很常用。抽象模板(AbstractClass)中的方法基本分两类:
-
基本方法:子类去实现的方法 ,并且在模板方法中被调用。
-
模板方法:把基本操作方法组合在一起形成一个总算法或一个总行为的方法;一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
而具体模板(ConcreteClass)主要是实现父类定义的抽象的基本方法。
3、代码实现
InterfaceClass
package com.bing.TemplateMethod07;
public interface InterfaceClass {
// 一些抽象行为,放到子类去实现
void PrimitiveOperation1();
void PrimitiveOperation2();
// 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现
void TemplateMethod();
}
ConcreteClassA
package com.bing.TemplateMethod07;
public class ConcreteClassA implements InterfaceClass{
@Override
public void PrimitiveOperation1() {
System.out.println("具体实现A的方法");
}
@Override
public void PrimitiveOperation2() {
System.out.println("具体是实现B的方法");
}
@Override
public void TemplateMethod() {
}
}
举例TestModel
public abstract class TestModel {
//开机
protected abstract void open();
//检查
protected abstract void check();
//关闭
protected abstract void close();
//模板方法-测试
public void test(){
this.open();;
this.check();
this.close();
}
}
public class Phone1 extends TestModel {
@Override
protected void open() {
System.out.println("phone1的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone1的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone1的关机逻辑");
}
}
public class Phone2 extends TestModel {
@Override
protected void open() {
System.out.println("phone2的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone2的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone2的关机逻辑");
}
}
4、模板方法模式的优缺点及应用
优点
-
封装不变部分,扩展可变的部分。
-
提取了公共的代码,减少代码量,方便维护。
-
父类控制方法,子类去实现。
缺点
- 代码的阅读难度会增加,尤其是新手。我们习惯认为抽象类申明的是最抽象的、最一般的事物属性和方法,实现类完成具体的事物属性和方法;而在模板方法模式中,抽象类中定义了部分抽象方法,而子类实现父类后执行的结果影响了父类,子类对父类产生了影响。
应用
-
重构
-
规定算法
-
抽取公共的逻辑
5、特点
当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
通过大话设计模式及网上的一些小文章所学