美文网首页设计模式
[设计模式]一文读懂模板方法

[设计模式]一文读懂模板方法

作者: AbstractCulture | 来源:发表于2020-12-06 15:35 被阅读0次

    模板方法

    定义: 在模板方法中,有一个公共的抽象类声明了一个模板方法,其中包括:

    • 必定会执行的模板方法,子类无法实现
    • 用户必须实现的方法,该方法表达不同的行为(abstart)
    • 根据自身需求选择实现的钩子方法(Hook)

    而对于外部来说,只暴露接口定义的行为。设计原则:对扩展开放,对修改关闭。

    用例图

    其实我在博客平台发文章这件事,就符合模板方法。
    对于用户来说,在博客平台进行文章发布的行为,都要经过几个步骤:

    • 新建一个文章
    • 写自己的内容
    • 将文章进行发布

    最后,你可以根据自己的需求,对平台进行充值,享用更高级的平台服务。

    在这个过程中,所有的用户都需要使用博客平台进行新建文章发布文章的操作,但是写作内容因人而异,但是你必须编辑了内容才可以发布文章,而升级VIP则根据用户自己的需求,如果觉得抽象,可以看看我画的用例图。

    article

    代码示例

    • ArticleEvent
    package com.xjm.design.template;
    
    /**
     * @author jaymin
     * 2020/12/6 1:48
     */
    public interface ArticleEvent {
    
        /**
         * 发布文章
         */
        void pushArticle();
    }
    
    • ArticleEventTemplate
    package com.xjm.design.template;
    
    /**
     * @author jaymin
     * 2020/12/6 1:49
     */
    public abstract class ArticleEventTemplate implements ArticleEvent {
    
        @Override
        public final void pushArticle() {
            joinMembership();
            createArticle();
            write();
            push();
        }
    
        /**
         * 钩子方法,默认当前用户为普通用户
         */
        protected void joinMembership() {
            System.out.println("************普通用户****************");
        }
    
        /**
         * 平台默认实现,所有用户复用这个逻辑,不可以重写
         */
        private void createArticle() {
            System.out.println("新建文章");
        }
    
        /**
         * 抽象方法,子类必须实现
         */
        protected abstract void write();
    
        /**
         * 平台默认实现,所有用户复用这个逻辑,不可以重写
         */
        private void push() {
            System.out.println("发布 \n");
        }
    }
    
    • NormalUserArticleEvent
    package com.xjm.design.template;
    
    /**
     * @author jaymin
     * 继承模板类,当前角色为普通用户br>
     * 2020/12/6 15:07
     */
    public class NormalUserArticleEvent extends ArticleEventTemplate {
    
        @Override
        public void write() {
            System.out.println("随便写写:---------");
        }
    }
    
    • MarketingUserArticleEvent
    package com.xjm.design.template;
    
    /**
     * @author jaymin<br>
     * 继承模板类,当前角色为营销号<br>
     * 2020/12/6 15:09
     */
    public class MarketingUserArticleEvent extends ArticleEventTemplate {
    
        @Override
        public void write() {
            System.out.println("震惊!当代年轻人竟然平均996:---------");
        }
    
        @Override
        public void joinMembership() {
            System.out.println("***********会员用户************");
        }
    }
    package com.xjm.design.template;
    
    /**
     * @author jaymin<br>
     * 继承模板类,当前角色为营销号<br>
     * 2020/12/6 15:09
     */
    public class MarketingUserArticleEvent extends ArticleEventTemplate {
    
        @Override
        public void write() {
            System.out.println("震惊!当代年轻人竟然平均996:---------");
        }
    
        @Override
        public void joinMembership() {
            System.out.println("***********会员用户************");
        }
    }
    
    • AuthorUserArticleEvent
    package com.xjm.design.template;
    
    /**
     * @author jaymin<br>
     * 继承模板类,当前角色为专业的作家<br>
     * 2020/12/6 15:11
     */
    public class AuthorUserArticleEvent extends ArticleEventTemplate {
    
        @Override
        public void write() {
            System.out.println("论中华五千年的文化传承:--------");
        }
    
        @Override
        public void joinMembership() {
            System.out.println("************会员用户***********");
        }
    }
    
    • TemplatePatternDemo
    package com.xjm.design.template;
    
    /**
     * @author jaymin
     * 2020/12/6 15:14
     */
    public class TemplatePatternDemo {
        public static void main(String[] args) {
            ArticleEvent normalUserArticleEvent = new NormalUserArticleEvent();
            ArticleEvent marketingUserArticleEvent = new MarketingUserArticleEvent();
            ArticleEvent authorUserArticleEvent = new AuthorUserArticleEvent();
            normalUserArticleEvent.pushArticle();
            marketingUserArticleEvent.pushArticle();
            authorUserArticleEvent.pushArticle();
        }
    }
    
    • 输出结果
    result

    总结

    • 模板方法将代码复用这件事落实地很好,将可复用的代码在模板类中进行实现,将钩子与必须实现的方法,交由子类实现。
    • 模板方法最好加上final,防止子类重写。
    • 缺点:不同的实现都需要创建一个类进行实现,会导致类膨胀。
    • 学习Spring源码的过程中,可以看看refresh(),它就是一个模板方法的体现,还有Spring data 中的很多类,诸如:jdbcTemplate、jmsTemplate等等

    相关文章

      网友评论

        本文标题:[设计模式]一文读懂模板方法

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