模板方法模式

模板方法模式

模板方法模式的定义

1.定义:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

所有的重复的代码上升到父类去,而不是让每个子类都去重复

模板方法使通过把不变行为搬到超类,去除子类中的重复代码来体现它的优势,提供了一个很好的代码复用的平台,当不变的和可变的行为在方法中的子类实现中混在一起的时候,不变的行为就会在子类中重复出现;我们通过模板方法把这些行为搬到单一的地方,这样就可以帮助子类拜托重复的不变行为的纠缠

模板方法模式结构图

image-20210316143359876.png

模板方法模式的实现

代码结构图

image-20210316143509453.png

1.新建一个抽象父类TestPaper 对应模板方法中的AbstractClass,定义算法的骨架及子类重定义的方法

package org.example.template;

/**
 * @author 
 * @date 2021/3/16 14:00
 **/
public class TestPaper {

    public void TestQuestion1(){
        System.out.println("第一題");
        System.out.println("答案是:"+Answer1());
    }
    public void TestQuestion2(){
        System.out.println("第二題");
        System.out.println("答案是:"+Answer2());
    }
    public void TestQuestion3(){
        System.out.println("第三題");
        System.out.println("答案是:"+Answer3());
    }
    public void TestQuestion4(){
        System.out.println("第四題");
        System.out.println("答案是:"+Answer4());
    }
    //抽象行为给子类去实现
    protected String Answer1(){
        return "";
    }
    protected String Answer2(){
        return "";
    }
    protected String Answer3(){
        return "";
    }
    protected String Answer4(){
        return "";
    }
}

2.新建具体的TestPaperA及TestPaper对应模板方法模式的ConcreteClass,并实现父类定义给子类实现的方法

public class TestPaperA extends TestPaper{

    @Override
    protected String Answer1() {
        return "a";
    }

    @Override
    protected String Answer2() {
        return "b";
    }

    @Override
    protected String Answer3() {
        return "c";
    }

    @Override
    protected String Answer4() {
        return "d";
    }
}


public class TestPaperB extends TestPaper{
    @Override
    protected String Answer1() {
        return "d";
    }

    @Override
    protected String Answer2() {
        return "c";
    }

    @Override
    protected String Answer3() {
        return "b";
    }

    @Override
    protected String Answer4() {
        return "a";
    }
}

3.客户端调用

package org.example.template;


/**
 * @author 
 * @date 2021/3/16 14:17
 **/
public class Client {
    public static void main(String[] args) {
        System.out.println("學生A答案如下:");
        //用父类接收,多态
        TestPaper testPaperA = new TestPaperA();
        testPaperA.TestQuestion1();
        testPaperA.TestQuestion2();
        testPaperA.TestQuestion3();
        testPaperA.TestQuestion4();
        System.out.println("學生B答案如下:");
        TestPaper testPaperB = new TestPaperB();

        testPaperB.TestQuestion1();
        testPaperB.TestQuestion2();
        testPaperB.TestQuestion3();
        testPaperB.TestQuestion4();
    }
}

4.运行结果

image-20210316144024455.png

模板方法的优缺点

优点

1.把不可改变的封装起来,把能够改变的扩展开来,符合开闭原则

2.把很多类的共同操作给封装起来,利于维护

3.其实我们发现,我们在定义行为时候都是由父类去定义,然后子类去实现即可

缺点

虽然我们把一些类的共同操作封装起来,但是当这些类比较多时,效果就不会很好,会多很多类,提高编译效率,提升内存开销

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容