• 设计模式


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

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

    父类

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

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

    完整代码

  • 相关阅读:
    Internet Explorer 11:不要再叫我IE
    C#汉字转拼音
    winfrom设置当前画面始终显示在最前面
    解决 winform打开网页 和WebBrowser打开链接360误报拦截的问题
    dataGridView使用指南系列一、回车换行或换列完美解决方案
    C#--WinForm项目主窗体设计
    C#后台解析 json 动态解析 通用(Dictionary)
    在windows下安装git中文版客户端并连接gitlab
    检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)
    关闭窗体后,进程仍然在运行的问题重现与解决
  • 原文地址:https://www.cnblogs.com/guohaien/p/10450491.html
Copyright © 2020-2023  润新知