模板方法模式详解(设计类图及实现例子)

模板方法模式详解(设计类图及实现例子)-mikechen

模板方法模式是常用的Java设计模式,下面我重点详解模板方法模式的组件实现与应用场景@mikechen

模板方法模式定义

模板方法模式,全称是Template Method Pattern,是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。

模板方法模式允许,子类为一个算法的不同步骤提供不同的实现,而无需改变算法的结构。

 

模板方法模式设计

模板方法模式的类图,包含以下几个角色:

模板方法模式详解(设计类图及实现例子)-mikechen

  1. 抽象类(Abstract Class):定义了一个模板方法,其中包含一些抽象方法和具体方法,它们表示一个算法的不同步骤,其中某些步骤可能需要由子类实现。
  2. 具体类(Concrete Class):继承抽象类,实现抽象方法,并重写模板方法中需要定制的部分。

通过抽象类和具体类之间的继承关系,模板方法模式将算法的骨架和具体实现分离开来,使得算法的实现可以在不同的子类中灵活定制和扩展。

同时,模板方法模式还可以避免子类重复实现相同的算法骨架,提高了代码的重用性和可维护性。

 

模板方法模式实现例子

假设我们正在编写一个电子商务平台,其中有不同的支付方式,如支付宝、微信支付、银行卡支付等。

每个支付方式的支付流程大体相同,都包括连接服务器、验证身份、扣款等步骤,但其中一些细节可能有所不同。

我们可以使用模板方法模式来实现这个支付流程,如下所示:

// 抽象支付类
public abstract class Payment {
    // 模板方法,定义了支付流程的步骤
    public final void pay() {
        connectServer();
        authenticate();
        if (isAuthenticated()) {
            deduct();
            showPaymentResult();
        } else {
            showAuthError();
        }
    }

    // 抽象方法,由子类实现不同的支付方式
    protected abstract void deduct();

    // 具体方法,所有支付方式共同实现的方法
    protected void connectServer() {
        System.out.println("Connect to payment server...");
    }

    // 具体方法,所有支付方式共同实现的方法
    protected void authenticate() {
        System.out.println("Authenticate payment...");
    }

    // 具体方法,所有支付方式共同实现的方法
    protected boolean isAuthenticated() {
        return true;
    }

    // 具体方法,所有支付方式共同实现的方法
    protected void showPaymentResult() {
        System.out.println("Payment success!");
    }

    // 具体方法,所有支付方式共同实现的方法
    protected void showAuthError() {
        System.out.println("Authentication failed!");
    }
}

// 支付宝支付类
public class AliPay extends Payment {
    @Override
    protected void deduct() {
        System.out.println("Deduct payment from Alipay account...");
    }
}

// 微信支付类
public class WeChatPay extends Payment {
    @Override
    protected void deduct() {
        System.out.println("Deduct payment from WeChat account...");
    }
}

// 银行卡支付类
public class CardPay extends Payment {
    @Override
    protected void deduct() {
        System.out.println("Deduct payment from bank card...");
    }
}

 

模板方法模式应用场景

如果我们需要定义一个算法的骨架,同时允许子类实现某些步骤,而不改变算法的整体结构,那么可以考虑使用模板方法模式。

模板方法模式应用场景如下:

1.算法骨架固定,但具体实现可能会变化

当我们需要定义一个算法的框架,但具体的实现细节可能因应用的不同而变化时,可以使用模板方法模式。

2.多个类具有相同的算法结构

如果多个类具有相同的算法结构,但其中某些步骤的实现可能不同,可以使用模板方法模式来避免代码的重复。

3.针对复杂的流程或者业务逻辑

模板方法模式可以帮助我们将复杂的流程或业务逻辑分解为一系列步骤,从而更好地组织代码和管理逻辑。

4.框架开发

在框架开发中,我们通常需要定义一些基础类或接口,然后由客户端来实现具体的业务逻辑。

比如:Hibernate中的Template和Callback等,这时候模板方法模式可以帮助我们定义通用的算法骨架,从而减少客户端的工作量。

以上就是模板方法模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法