设计模式(二十二)模板方法模式

作者: 我犟不过你 | 来源:发表于2021-01-26 11:16 被阅读0次

    1、概述

    模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。

    2、使用场景

    1)当你只希望客户端扩展某个特定算法步骤, 而不是整个算法或其结构时, 可使用模板方法模式。
    2)当多个类的算法除一些细微不同之外几乎完全一样时, 你可使用该模式。 但其后果就是, 只要算法发生变化, 你就可能需要修改所有的类。

    3、实例

    有以下场景:

    有三个电商网站:
    淘宝,京东,拼多多
    都具有以下相似的能力:
    登录,登出,查询商品,下单。
    
    模板方法实现。
    

    创建商城抽象接口:

    /**
     * 商城顶层抽象
     * @date: 2021/1/26
     * @author weirx
     * @version 3.0
     */
    abstract class Mall {
    
        /**
         * 登录
         */
        public abstract void login();
    
        /**
         * 登出
         */
        public abstract void logout();
    
        /**
         * 查询商品
         */
        public abstract void query();
    
        /**
         * 下单
         */
        public abstract void order();
    }
    

    创建淘宝:

    /**
     * 淘宝
     * @date: 2021/1/26
     * @author weirx
     * @version 3.0
     */
    public class Taobao extends Mall{
    
        @Override
        public void login() {
            System.out.println("登录淘宝商城");
        }
    
        @Override
        public void logout() {
            System.out.println("退出淘宝商城");
        }
    
        @Override
        public void query() {
            System.out.println("查询淘宝商城商品");
        }
    
        @Override
        public void order() {
            System.out.println("淘宝商城下单");
        }
    }
    

    创建京东:

    /**
     * 淘宝
     * @date: 2021/1/26
     * @author weirx
     * @version 3.0
     */
    public class Jingdong extends Mall{
    
        @Override
        public void login() {
            System.out.println("登录京东商城");
        }
    
        @Override
        public void logout() {
            System.out.println("退出京东商城");
        }
    
        @Override
        public void query() {
            System.out.println("查询京东商城商品");
        }
    
        @Override
        public void order() {
            System.out.println("京东商城下单");
        }
    }
    

    创建拼多多:

    /**
     * 淘宝
     * @date: 2021/1/26
     * @author weirx
     * @version 3.0
     */
    public class Pinduoduo extends Mall{
    
        @Override
        public void login() {
            System.out.println("登录拼多多商城");
        }
    
        @Override
        public void logout() {
            System.out.println("退出拼多多商城");
        }
    
        @Override
        public void query() {
            System.out.println("查询拼多多商城商品");
        }
    
        @Override
        public void order() {
            System.out.println("拼多多商城下单");
        }
    }
    

    4、分析

    Mall.png

    三个商城分别继承Mall,并重写其接口。

    5、总结

    优点:
    1)你可仅允许客户端重写一个大型算法中的特定部分, 使得算法其他部分修改对其所造成的影响减小。
    2)你可将重复代码提取到一个超类中。
    缺点:
    1)部分客户端可能会受到算法框架的限制。
    2)通过子类抑制默认步骤实现可能会导致违反里氏替换原则
    3)模板方法中的步骤越多, 其维护工作就可能会越困难。

    相关文章

      网友评论

        本文标题:设计模式(二十二)模板方法模式

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