• 设计模式之模板方法模式


    模板方法模式定义

    Template Method Pattern:  Define the skeleton of an algorithm in an  operation, deferring some steps to subclasses. Template Method lets  subclasses redefine certain steps of an algorithm without changing the  algorithm's structure.

    上面的意思就是说,在一个操作中定义一个算法的框架,推迟一些步骤到子类中(我的理解就是,将父类中的某些抽象方法在子类中进行具体实现),模板方法让子类在不改变算法结果的情况下,重新定义算法中的某些步骤.

    模式结构图

    代码示例

    1.定义抽象父类,也就是算法的骨架

    public abstract class AbstractLife {
    
        private void begin(){
            System.out.println("早上打卡");
        }
        //定义抽象方法,子类中具体实现
        protected abstract void work();
        private void end(){
            System.out.println("下午打卡");
        }
        public abstract void freeTime();
    
        public void dayLife(){
            begin();
            work();
            end();
            freeTime();
        }
    }

    2.定义子类,继承父类方法

    public class CommonOfficeWorker extends AbstractLife{
        @Override
        public void work() {
            System.out.println("普通上班族,正常上班");
        }
    
        @Override
        public void freeTime() {
            System.out.println("自由活动");
        }
    }
    public class SpecialProgrammer extends AbstractLife{
        @Override
        public void work() {
            System.out.println("程序员,正常上班");
        }
    
        @Override
        public void freeTime() {
            System.out.println("苦逼加班");
        }
    }

    3.测试类(因为java面向对象的特性,运行时,子类会重写父类的抽象方法)

    public class TestMain {
    
        public static void main(String[] args) {
    
            AbstractLife common = new CommonOfficeWorker();
            AbstractLife special = new SpecialProgrammer();
    
            common.dayLife();
            System.out.println("-----------");
            special.dayLife();
        }
    }

    4.运行结果

    优缺点

    优点:把不变的放到父类,把变化的细节在子类中具体重新定义,也可以有新的定义,有助于扩展,同时也简化了代码结构.

    缺点:每个实现都需要定义一个子类,如果子类特别多,那么这将会非常庞大,设计会越来越抽象.

  • 相关阅读:
    java学习day16--常用类之包装类
    String、StringBuffer、StringBuilder的异同
    java学习day15--常用类之字符串相关的类
    java学习day15--Arrays工具类
    java学习day14--二维数组
    java学习day14--可变长参数
    java学习day13--数组
    java学习day13--自定义异常类
    java学习day12--异常
    接口和抽象类的异同
  • 原文地址:https://www.cnblogs.com/fxust/p/8179041.html
Copyright © 2020-2023  润新知