设计模式之模板方法模式

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)运行结果

相关推荐
庞轩px1 天前
第六篇:Spring用了哪些设计模式?——从单例到代理,拆解框架中的经典设计
java·spring·设计模式·bean·代理模式·aop·单例
多加点辣也没关系1 天前
设计模式-工厂方法模式
设计模式·工厂方法模式
多加点辣也没关系1 天前
设计模式-建造者模式
设计模式·建造者模式
多加点辣也没关系2 天前
设计模式-桥接模式
设计模式·桥接模式
雪度娃娃2 天前
结构型设计模式——装饰模式
设计模式·装饰器模式
sensen_kiss2 天前
CPT304 SoftwareEngineeringII 软件工程 2 Pt.4 设计模式(下)
设计模式·软件工程
多加点辣也没关系2 天前
设计模式-适配器模式
设计模式
Forget the Dream2 天前
基于适配器模式的 Axios 封装实践
设计模式·typescript·axios·适配器模式
Java面试题总结2 天前
【设计模式03】使用模版模式+责任链模式优化实战
设计模式·责任链模式
庞轩px2 天前
Redis工具类重构——从臃肿到优雅的门面模式实践
数据库·redis·设计模式·重构·门面模式·可扩展性·可维护性