• java23种设计模式-行为型模式-模板方法模式


    一、定义

    在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

    二、优点及缺点

    优点:

    1、封装不变部分,扩展可变部分。

    2、提取公共代码,便于维护。

    3、行为由父类控制,子类实现。

    缺点:

    1、每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

    三、代码实现:

     模板类:

    package com.example.demo.sjms.mobanfangfamoshi;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月10日 09:11:50
     *  @Description: 模板类
     */
    public abstract class Shop {
        
        /**
         *  @Author: caesar
         *  @Date:2020年11月10日 09:11:59
         *  @Description: 模板方法
         */
            public final void buy(){
                this.type();
                this.getOut();
                this.sayThankYou();
            }
        /**
         *  @Author: caesar
         *  @Date:2020年11月10日 09:11:21
         *  @Description: 抽象方法
         */
        public abstract void type();
        /**
         *  @Author: caesar
         *  @Date:2020年11月10日 09:11:32
         *  @Description: 已经实现方法
         */
        public void getOut(){
            System.out.println("将商品带走。。。。。。");
        }
        /**
         *  @Author: caesar
         *  @Date:2020年11月10日 09:11:51
         *  @Description: 钩子方法
         */
        public void sayThankYou(){
    
        }
    }

    实现类1:

    package com.example.demo.sjms.mobanfangfamoshi;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月10日 09:11:50
     *  @Description: 模板方法的子类
     */
    public class Student extends Shop{
    
        @Override
        public void type() {
            System.out.println("使用现金支付。。。。。。");
        }
        @Override
        public void sayThankYou(){
            System.out.println("谢谢你啦。。。。。。");
        }
    }

    实现类2:

    package com.example.demo.sjms.mobanfangfamoshi;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月10日 09:11:27
     *  @Description: 坏人
     */
    public class BadPerson extends Shop{
        @Override
        public void type() {
            System.out.println("使用信用卡支付。。。。。。");
        }
    }

    测试类;

    package com.example.demo.sjms.mobanfangfamoshi;
    
    /**
     *  @Author: caesar
     *  @Date:2020年11月10日 09:11:12
     *  @Description: 测试类
     */
    public class Test {
        public static void main(String[] args) {
            Student student = new Student();
            BadPerson badPerson = new BadPerson();
            student.buy();
            badPerson.buy();
        }
    }

    四、源码级别

    五、总结

    使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

    注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。

  • 相关阅读:
    BZOJ 2456 mode
    BZOJ 1041 [HAOI2008]圆上的整点
    东北育才 第6天和第7天
    POJ 3692 Kindergarten(最大团问题)
    KM算法及其应用
    UVA 11582 Colossal Fibonacci Numbers!(循环节打表+幂取模)
    ZOJ 3960 What Kind of Friends Are You?(读题+思维)
    POJ 2349 Arctic Network(最小生成树中第s大的边)
    HDU 1576 A/B(欧几里德算法延伸)
    NYOJ 1013 除法表达式(欧几里德算法+唯一分解定理)
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13952105.html
Copyright © 2020-2023  润新知