一天一种设计模式之十二-----模版方法模式

一.模版方法模式简介

  1. 模版方法模式属于行为型模式。

  2. 该模式定义一个操作中算法的框架,而将一些步骤延迟到了子类中,使得子类可以不改变算法的结构即可重新定义算法中的某些特定步骤。

  3. 模版方法模式是编程中经常会用到的一种模式。

  4. 模版方法模式由一个抽象类和一个实现类通过继承的结构组成,抽象类中的方法分为三种

    1. 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由他的子类去实现。

    2. 模版方法:由抽象类声明并加以实现,但一般来说,模版方法中会调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。

    3. 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。

  5. 抽象类的任务是搭建逻辑框架,实现类用于实现细节。

  6. 优点:

    1. 容易扩展。一般来说,抽象类中的模版方法是不易产生改变的部分,而抽象方法是容易产生变化的部分。因此通过增加实现类可以实现功能的扩展,符合开闭原则。

    2. 便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法。因此维护起来很方便

    3. 比较灵活。因为有钩子方法,因此,子类的实现也可以影响到父类中主逻辑的运行。

  7. 缺点

    1. 在灵活的同时,由于子类影响到了父类,所以违反了里氏替换原则,会给程序带来风险。这就对抽象类的设计有了更高的要求。这也是java三大特点中继承这个特点的通病。

    2. 该模式也违反了面向接口编程。

  8. 适用场景

    1. 在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑适用模版方法模式。

    2. 在程序的主框架相同,细节不同的场景下,也比较适合使用这种模式。

           

二.测试代码

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();
}




你可能感兴趣的:(一天一种设计模式之十二-----模版方法模式)