zoukankan      html  css  js  c++  java
  • 设计模式

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

    可以理解为将不变的行为放在父类中,会发生变化的行为在子类中实现,这样可以避免子类中出现大量重复的代码。也就是说当子类中的方法混合了不变和可变的行为,我们通过模板方法就能将这些不变的行为放到一个单独的地方。模板方法的类结构比较简单,下面直接贴出代码

    父类

    public abstract class AbstractClass {
        /**
         * 可变方法1
         */
        public abstract void changeMethod1();
    
        /**
         * 可变方法2
         */
        public abstract void changeMethod2();
    
        public void templateMethod() {
            System.out.println("执行可变方法1前");
            changeMethod1();
            System.out.println("执行可变方法1后");
            System.out.println("执行可变方法2前");
            changeMethod2();
            System.out.println("执行可变方法2后");
        }
    }

    两个子类

    public class ConcreteClassA extends AbstractClass {
        @Override
        public void changeMethod1() {
            System.out.println("子类A的可变方法1");
        }
    
        @Override
        public void changeMethod2() {
            System.out.println("子类A的可变方法2");
        }
    }
    public class ConcreteClassB extends AbstractClass {
        @Override
        public void changeMethod1() {
            System.out.println("子类B的可变方法1");
        }
    
        @Override
        public void changeMethod2() {
            System.out.println("子类B的可变方法2");
        }
    }

    测试代码和输出结果

    AbstractClass a = new ConcreteClassA();
    a.templateMethod();
    System.out.println("------------------");
    AbstractClass b = new ConcreteClassB();
    b.templateMethod();

     从上面代码可以看出templateMethod方法中只有一部分是会随子类的实现不同发生改变,通过模板方法让我们不需要在子类中重复编写那些不变的代码。接下来我们通过一个简单的抄考卷的例子,来加深对模板方法的理解,代码如下

    考卷抽象类

    public abstract class AbstractPaper {
    
        public void createPaper() {
            question1();
            answerText();
            answer1();
            question2();
            answerText();
            answer2();
            question3();
            answerText();
            answer3();
        }
    
        public void question1() {
            System.out.println("问题1:");
        }
    
        public void question2() {
            System.out.println("问题2:");
        }
    
        public void question3() {
            System.out.println("问题3:");
        }
    
        public void answerText() {
            System.out.print("答案:");
        }
    
        /**
         * 问题1的答案
         */
        public abstract void answer1();
        /**
         * 问题2的答案
         */
        public abstract void answer2();
        /**
         * 问题3的答案
         */
        public abstract void answer3();
    }

    两张答案不同的考卷(省略一个,代码类似)

    public class PaperA extends AbstractPaper {
        @Override
        public void answer1() {
            System.out.println("A");
        }
    
        @Override
        public void answer2() {
            System.out.println("B");
        }
    
        @Override
        public void answer3() {
            System.out.println("C");
        }
    }

    测试代码和输出结果

    AbstractPaper paperA = new PaperA();
    paperA.createPaper();
    System.out.println("------------");
    AbstractPaper paperB = new PaperB();
    paperB.createPaper();

    以上就是整个功能的实现代码,可以通过点击以下链接获取完整代码

    完整代码

  • 相关阅读:
    因为公司项目需要,我要学习PB了,哎
    送给自己人生的第一份生日礼物——Java小游戏!
    第二讲 Java 开发环境搭建
    IT学生关于“怎么学习”的思考,这也是其他人思考的问题吗?
    第四讲 类与对象
    第一讲 Java 介绍
    第三讲 Java 基本数据类型+运算符
    初步理解Lambda表达式的简单实现
    一道关于pack()和sizeof笔试题
    排序源码(待续)
  • 原文地址:https://www.cnblogs.com/guohaien/p/10450491.html
Copyright © 2011-2022 走看看