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,并重写其接口。

5、总结

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

举报

相关推荐

0 条评论