美文网首页设计模式系列篇
设计模式系列篇(十三)——模版模式

设计模式系列篇(十三)——模版模式

作者: 复旦猿 | 来源:发表于2020-08-30 22:14 被阅读0次

What

模板模式(Template Pattern)是一种行为设计模型。该模式指的是一个定义在父类别的方法,在模板方法中会呼叫多个定义在父类别的其他方法,而这些方法有可能只是抽象方法并没有具体实现,模板方法仅决定这些抽象方法的执行顺序,这些抽象方法的实作由子类别负责,并且子类别不允许覆写模板方法。

Why

模版模式具有两大优点:

  1. 复用,模版模式将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。

  2. 扩展。模版模式实现了反向控制,通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制,并且符合“开闭原则”。

When

  1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;
  2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;
  3. 控制子类的扩展。

How

模版模式是基于继承的,父类中定义好算法的整体框架方法,该方法中会调用所需要子类扩展的子方法;然后子类继承父类,重写父类中的子方法。一般说来,父类的整体框架方法定义为final,避免子类重写;而需要扩展的子方法定义为abstract,强制子类重写。
今天,我们就以我在公司和学校的不同生活为例来介绍模版模式的实现。

public abstract class AbstractDailyLife {
    public void getUp() {
        System.out.println("get up and wash");
    }

    public abstract void breakfast();

    public abstract void work();

    public abstract void lunch();

    public abstract void dinner();

    public void sleep() {
        System.out.println("Go to sleep");
    }

    public final void live() {
        System.out.println("The new day begins");
        getUp();
        breakfast();
        work();
        lunch();
        work();
        dinner();
        work();
        sleep();
        System.out.println("The day has gone\n");
    }
}

public class SchoolDailyLife extends AbstractDailyLife {
    @Override
    public void breakfast() {
        System.out.println("No breakfast");
    }

    @Override
    public void work() {
        System.out.println("Experiment & Write");
    }

    @Override
    public void lunch() {
        System.out.println("Normal lunch when I'am hungry.");
    }

    @Override
    public void dinner() {
        System.out.println("Normal dinner when I'am hungry.");
    }

    @Override
    public void sleep() {
        System.out.println("I can persist, continue experimenting and writing");
    }
}

public class CompanyDailyLife extends AbstractDailyLife {
    @Override
    public void breakfast() {
        System.out.println("Have healthy breakfast at about 9 AM.");
    }

    @Override
    public void work() {
        System.out.println("Code & Find bugs & Fix bugs");
    }

    @Override
    public void lunch() {
        System.out.println("Have rich lunch at about 12 PM.");
    }

    @Override
    public void dinner() {
        System.out.println("Have delicious dinner at about 7 PM.");
    }

    @Override
    public void sleep() {
        System.out.println("Go to sleep at about 12 AM.");
    }
}

AbstractDailyLife该抽象类中的框架方法为live(),其中调用的其他方法中getUp()sleep()方法为公共方法,不需要子类重写(但也可以重写),而其他方法,如breakfast()work()强制需要子类重写。

最后,搞个测试类,搞定。

public class TestMain {
    public static void main(String[] args) {
        // life in school
        AbstractDailyLife lifeInSchool = new SchoolDailyLife();
        lifeInSchool.live();

        // life in company
        AbstractDailyLife lifeInCompany = new CompanyDailyLife();
        lifeInCompany.live();
    }
}

输出如下:

The new day begins
get up and wash
No breakfast
Experiment & Write
Normal lunch when I'am hungry.
Experiment & Write
Normal dinner when I'am hungry.
Experiment & Write
I can persist, continue experimenting and writing
The day has gone

The new day begins
get up and wash
Have healthy breakfast at about 9 AM.
Code & Find bugs & Fix bugs
Have rich lunch at about 12 PM.
Code & Find bugs & Fix bugs
Have delicious dinner at about 7 PM.
Code & Find bugs & Fix bugs
Go to sleep at about 1 AM.
The day has gone

是的,校园生活就是这样平淡无奇,哈哈~

代码地址

i-learning

写在最后

如果你觉得我写的文章帮到了你,欢迎点赞、评论、分享、赞赏哦,你们的鼓励是我不断创作的动力~

相关文章

网友评论

    本文标题:设计模式系列篇(十三)——模版模式

    本文链接:https://www.haomeiwen.com/subject/yjzesktx.html