• 设计模式学习--模板方法模式


    模板方法模式(TemplateMethod):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个

    算法的结构即可重新定义该算法的某些特定步骤。

    模板方法模式结构图:

    案例展示:老师讲试题抄写在黑板上,每个学生在答题卡上写上答案,

    1:创建一个试题的超类。

    package TemplateMethod;
    
    /**
     * 试卷类
     * @author 我不是张英俊
     *
     */
    public abstract  class TestPaper {
    
        public void testQuestion1(){
            System.out.println("先有鸡还是先有蛋()");
            System.out.println("A:鸡        B:蛋        C:A and B        D:以上答案都错误");
        }
        
        public void testQuestion2(){
            System.out.println("铁锈的主要成分是()");
            System.out.println("A:C元素    B:Al元素    C:Fe元素        D:O元素");
        }
        
        public void testQuestion3(){
            System.out.println("马是怎么睡觉的()");
            System.out.println("A:躺着    B:趴着    C:坐着    D:站着");
        }
        
        public abstract  String answer1();
        public abstract  String answer2();
        public abstract  String answer3();
    }

    2:学生1的答题纸。

    package TemplateMethod;
    
    public class Student1 extends TestPaper{
    
        @Override
        public String answer1() {
            // TODO Auto-generated method stub
            return "A";
        }
    
        @Override
        public String answer2() {
            // TODO Auto-generated method stub
            return "B";
        }
    
        @Override
        public String answer3() {
            // TODO Auto-generated method stub
            return "C";
        }
    
        
    }

    3:学生2的答题纸

    package TemplateMethod;
    
    public class Student2 extends TestPaper {
    
        @Override
        public String answer1() {
            // TODO Auto-generated method stub
            return "C";
        }
    
        @Override
        public String answer2() {
            // TODO Auto-generated method stub
            return "B";
        }
    
        @Override
        public String answer3() {
            // TODO Auto-generated method stub
            return "A";
        }
    
    }

    4:测试类.

    package TemplateMethod;
    
    /**
     * 需求:考试抄试卷,
     * 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类
     * 可以不改变一个算法的解耦股即可重新定义该算法的某些特定步骤。
     * @author 我不是张英俊
     *
     */
    public class Test {
    
        public static void main(String[] args) {
            //可以理解为:老师将试题抄在黑板上,然后大家看,在纸上写上各自的答案
            //然后将各自的纸交给老师。
            
            TestPaper s1=new Student1 ();
            System.out.println("学生1交的答题卡");
            System.out.println(s1.answer1());
            System.out.println(s1.answer2());
            System.out.println(s1.answer3());
            
            TestPaper s2=new Student2();
            System.out.println("学生2交的答题卡");
            System.out.println(s2.answer1());
            System.out.println(s2.answer2());
            System.out.println(s2.answer3());
        }
    
    }

    5:控制台

    学生1交的答题卡
    A
    B
    C
    学生2交的答题卡
    C
    B
    A

    总结:模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用的平台。

    当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为在子类中重复的出现,我们通过模板方法模式把这些行为搬移到单一的地方,

    这样就帮互助子类摆脱重复的不变行为的纠缠。

    缺点是每个不同的实现都必须写一个子类,增加了子类的数量,但是此种设计就更符合单一职责原则,提高了内聚

  • 相关阅读:
    Delphi开发组件
    WPF界面开发.NET环境该如何配置?不知道VS版本支持的看过来
    Map控件是如何支持矢量切片的?DevExpress WPF界面开发者必看!
    数据可视化新方式,SankeyDiagramControl类的使用你不能错过!(Part 1)
    VCL界面开发工具!DevExpress VCL v20.1.7全新出发
    如何使用自动生成的序列创建3D图表?DevExpress WPF有妙招(Part 3)
    如何使用Kendo UI在Vue.js中轻松构建UI组件?
    php结合redis实现高并发下的抢购、秒杀功能
    书写高质量SQL的30条建议
    php 通过openresty搭载负载均衡
  • 原文地址:https://www.cnblogs.com/hrlizhi/p/7661059.html
Copyright © 2020-2023  润新知