模板方法示意图
概念
模板方法模式,定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式的基本代码实现
根据上面的结构图,我们可以用代码来进行实现
AbstractClass(抽象模板):
package com.jxs.templateMethod;
/**
-
Created by jiangxs on 2018/5/7.
*/
public abstract class AbstractClass {public abstract void primitiveOperation1();
public abstract void primitiveOperation2();
// 模板方法,给出了逻辑的骨架
// 而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现
public void templateMethod() {primitiveOperation1(); primitiveOperation2(); System.out.println("");
}
}
ConcreteClass(实现父类所定义的一个或多个抽象方法)
ConcreteClassA:
package com.jxs.templateMethod;
/**
-
Created by jiangxs on 2018/5/7.
*/
public class ConcreteClassA extends AbstractClass {@Override
public void primitiveOperation1() {System.out.println("具体类A方法1实现");
}
@Override
public void primitiveOperation2() {System.out.println("具体类A方法2实现");
}
}
ConcreteClassB:
package com.jxs.templateMethod;
/**
-
Created by jiangxs on 2018/5/7.
*/
public class ConcreteClassB extends AbstractClass {@Override
public void primitiveOperation1() {System.out.println("具体类B方法1实现");
}
@Override
public void primitiveOperation2() {System.out.println("具体类B方法2实现");
}
}
客户端
package com.jxs.templateMethod;
/**
-
Created by jiangxs on 2018/5/7.
*/
public class Client {public static void main(String[] args) {
AbstractClass c; c = new ConcreteClassA(); c.templateMethod(); c = new ConcreteClassB(); c.templateMethod();
}
}
模板方法模式的总结
(1)模板方法模式的优点
①模板方法模式通过把不变的行为搬移到父类,去除了子类中的重复代码。
②子类实现算法的某些细节,有助于算法的扩展。
③通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
(2)模板方法模式的缺点
按照设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度。
(3)模板方法模式适合的场景
①多个子类有共有的方法,并且逻辑基本相同。
②重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
③重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为。
原文链接:https://blog.youkuaiyun.com/u013393958/article/details/80231327