zoukankan      html  css  js  c++  java
  • 模板方法模式(Template Method)

    定义:
     
    定义一个模板结构,将具体内容延迟到子类去实现。
     
    解决的问题:
     
    • 提高代码复用性。将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
    • 实现了反向控制。通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”
     
     
    uml类图:
     
     
    模式组成:
     
    • AbstractClass:抽象类。实现了模板方法,定义了算法的骨架
    • ConcreteClass:具体类。实现抽象类中的抽象方法,已完成完整的算法
     
    优点:
     
    • 提高代码复用性
    将相同部分的代码放在抽象的父类中
    • 提高了拓展性
    将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
    • 实现了反向控制
    通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
     
     
    缺点:
     
    • 引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度

    举个栗子:

    定义抽象角色

    abstract class AbstractPerson {
        public void prepareGotoSchool() {
            dressup();
            eatBreakfast();
            takeThings();
        }
    
        void dressup() {
            System.out.println("穿衣洗漱");
        }
    
        protected abstract void eatBreakfast();
    
        protected abstract void takeThings();
    }

    定义具体实现

    class Student extends AbstractPerson {
        @Override
        protected void eatBreakfast() {
            System.out.println("吃妈妈做好的早餐");
        }
    
        @Override
        protected void takeThings() {
            System.out.println("背书包,带好作业去学校");
        }
    }

    定义具体实现

    class Teacher extends AbstractPerson {
        @Override
        protected void eatBreakfast() {
            System.out.println("做早饭,并照顾孩子吃早饭");
        }
    
        @Override
        protected void takeThings() {
            System.out.println("带上昨晚准备的试卷");
        }
    }

    客户端调用

    public static void main(String[] args) {
            Student s = new Student();
            Teacher t = new Teacher();
            s.prepareGotoSchool();
            System.out.println("=============");
            t.prepareGotoSchool();
        }

    输出

  • 相关阅读:
    年终盘点 | 七年零故障支撑 双11 的消息中间件 RocketMQ,怎么做到的?
    刚刚,阿里云知行动手实验室正式开放公测了
    dubbogo 3.0:牵手 gRPC 走向云原生时代
    一个改变世界的“箱子”
    我看技术人的成长路径
    云原生体系下的技海浮沉与理论探索
    分布式事务框架 seata-golang 通信模型详解
    Serverless 如何落地?揭秘阿里核心业务大规模落地实现
    Github 2020 年度报告:你以为新冠击溃了开发者?不!他们创造了更多代码...
    493. Reverse Pairs
  • 原文地址:https://www.cnblogs.com/amei0/p/8057693.html
Copyright © 2011-2022 走看看