设计模式之模板方法模式

1.模板方法模式

定义了一个算法的骨架,并允许子类为某些步骤提供具体的实现。这种模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。

2.模板方法模式的基本概念

1)AbstractClass(抽象类)

定义了一个模板方法,该方法包含了一些基本的操作(通常是抽象方法或钩子方法)。

提供了默认实现的一些基本操作。

2)ConcreteClass(具体类)

继承自 AbstractClass,并实现其中的抽象方法或钩子方法.

可以覆盖一些方法以提供不同的实现。

3.举个栗子:

例如:人的一周,周一到周五上班,周六周日可以做自己喜欢的事.对于工作和空闲时间;其他的相对固定,如吃饭,刷牙,睡觉,这些比较固定,可以通过abstract实现模板类,通过继承实现抽象方法,或钩子函数

4.代码实现:

1)抽象类

java 复制代码
package org.xiji.template;

/**
 *  人的一周抽象类
 */
public abstract class OnePersonWeek {

    /**
     * 一个人的一天
     */
    public void onePersonDay(){
        wakeUp();
        brushTeeth();
        eat();
        if(judgeDay()){
            goToWork();
            goHome();
        }else{
            System.out.println("今天不上班");
            doMyFavourThing();

        }
        sleep();

    }

    //起床
    public void wakeUp(){
        System.out.println("起床");
    }
    //刷牙
    public void brushTeeth(){
        System.out.println("刷 teeth");
    }
    //吃饭
    public void eat(){
        System.out.println("吃 food");
    }
    //上班
    public void goToWork(){
        System.out.println("上班");
    }
    //下班
    public void goHome(){
        System.out.println("下班");
    }
    //睡觉
    public void sleep(){
        System.out.println("睡觉");
    }


    //判断今天是星期几(这个是抽象钩子函数)
    public abstract boolean judgeDay();

    //可以做任何事(这个是抽象函数)
    public abstract void doMyFavourThing();

}

2)抽象类实现类

java 复制代码
package org.xiji.template;

/**
 * 模板方法实现类
 */
public class MyDay extends OnePersonWeek{
    //
    private int day=1;

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    /**
     *
     * 判断是否是周末
     */
    @Override
    public boolean judgeDay() {
        if (this.day == 0 || this.day == 6) {
            return false;
        }

        return true;
    }

    /**
     * 做自己喜欢的事情
     */
    @Override
    public void doMyFavourThing() {
        System.out.println("今天出去散步,心情愉悦");
    }
}

3)测试类

java 复制代码
package org.xiji.template;

/**
 * 模板模式
 */
public class TemplateMain  {

    public static void main(String[] args) {
        MyDay myDay = new MyDay();

        for (int i = 0; i < 7; i++) {
            System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
            myDay.setDay(i);
            myDay.onePersonDay();
            System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");

        }
    }
}

4)运行结果

相关推荐
AI大法师22 分钟前
字标Logo设计指南:中文品牌如何用字体做出高级感与辨识度
人工智能·设计模式
Yu_Lijing1 小时前
基于C++的《Head First设计模式》笔记——中介者模式
笔记·设计模式·中介者模式
程序员小寒2 小时前
JavaScript设计模式(四):发布-订阅模式实现与应用
开发语言·前端·javascript·设计模式
是糖糖啊3 小时前
Agent 不好用?先别怪模型,试试 Harness Engineering
人工智能·设计模式
jiankeljx4 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
WarrenMondeville4 小时前
5.Unity面向对象-依赖倒置原则
unity·设计模式·依赖倒置原则
加个鸡腿儿20 小时前
从"包裹器"到"确认按钮"——一个组件的三次重构
前端·vue.js·设计模式
ALex_zry21 小时前
现代C++设计模式实战:从AIDC项目看工业级代码架构
c++·设计模式·架构
君主黑暗1 天前
设计模式-工厂模式
设计模式
han_1 天前
JavaScript设计模式(四):发布-订阅模式实现与应用
前端·javascript·设计模式