模版方法模式属于行为型模式。java
该模式定义一个操做中算法的框架,而将一些步骤延迟到了子类中,使得子类能够不改变算法的结构便可从新定义算法中的某些特定步骤。算法
模版方法模式是编程中常常会用到的一种模式。编程
模版方法模式由一个抽象类和一个实现类经过继承的结构组成,抽象类中的方法分为三种框架
抽象方法:父类中只声明但不加以实现,而是定义好规范,而后由他的子类去实现。ide
模版方法:由抽象类声明并加以实现,但通常来讲,模版方法中会调用抽象方法来完成主要的逻辑功能,而且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。测试
钩子方法:由抽象类声明并加以实现。可是子类能够去扩展,子类能够经过扩展钩子方法来影响模版方法的逻辑。spa
抽象类的任务是搭建逻辑框架,实现类用于实现细节。设计
优势:code
容易扩展。通常来讲,抽象类中的模版方法是不易产生改变的部分,而抽象方法是容易产生变化的部分。所以经过增长实现类能够实现功能的扩展,符合开闭原则。继承
便于维护。对于模版方法模式来讲,正是因为他们的主要逻辑相同,才使用了模版方法。所以维护起来很方便
比较灵活。由于有钩子方法,所以,子类的实现也能够影响到父类中主逻辑的运行。
缺点
在灵活的同时,因为子类影响到了父类,因此违反了里氏替换原则,会给程序带来风险。这就对抽象类的设计有了更高的要求。这也是java三大特色中继承这个特色的通病。
该模式也违反了面向接口编程。
适用场景
在多个子类拥有相同的方法,而且这些方法逻辑相同时,能够考虑适用模版方法模式。
在程序的主框架相同,细节不一样的场景下,也比较适合使用这种模式。
public class TestPaperMain { public static void main(String[] args) { TestPaperA a=new TestPaperA(); a.question1(); a.question2(); a.question3(); TestPaperB b=new TestPaperB(); b.question1(); b.question2(); b.question3(); } } class TestPaperA extends TestPaper { @Override public String anser1() { return "a"; } @Override public String anser2() { return "b"; } @Override public String anser3() { return "12"; } } class TestPaperB extends TestPaper { @Override public String anser1() { return "2"; } @Override public String anser2() { return "4"; } @Override public String anser3() { return "5"; } } abstract class TestPaper { public void question1() { System.out.println("1+1=?"); System.out.println("答案是" + anser1()); } public void question2() { System.out.println("2*2=?"); System.out.println("答案是" + anser2()); } public void question3() { System.out.println("8-3=?"); System.out.println("答案是" + anser3()); } public abstract String anser1(); public abstract String anser2(); public abstract String anser3(); }