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

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

作者: 复旦猿 | 来源:发表于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