Java设计模式 模板方法模式

什么是模板方法

模板方法模式是一个类的行为模式。定义一个操作流程的模板方法,然后声明部分抽象方法,迫使子类实现 并完善其业务逻辑,不同的子类有不同的实现 从而子类完善的业务逻辑也不一样。

模板方法模式的结构

AbstractClass: 抽象模板(Abstract Template)角色有如下责任

  • 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤
  • 定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

ConcreteClass:具体模板(Concrete Template)角色有如下责任:

  • 实现父类定义的抽象方法,它们是一个顶级逻辑的组成步骤。
  • 每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

在这里插入图片描述

举个例子:比如支付功能,有支付宝支付,微信支付。就可以定义一个支付的模板抽象类,定义一个支付的实现方法,再声明支付方式的抽象类。

模板抽象类,定义pay(monry)具体实现方法,声明callPay(money) 抽象方法,由子类实现

package com.template;

public abstract class AbstractPay {
    
    
    /**
     * 定义支付的实现方法
     * @param money 金额
     * @return
     */
    protected boolean pay(double money) {
    
    
        return callPay(money); // 调用字类的实现方法
    }
    /**
     * 声明抽象的支付方式
     * @param money
     * @return
     */
    protected abstract boolean callPay(double money);
}

支付宝支付继承类,实现callPay(money)抽象方法,说明支付不能小于20元

package com.template.concrete;

import com.template.AbstractPay;

public class AliPay extends AbstractPay {
    
    
    protected boolean callPay(double money) {
    
    
        System.out.println("支付宝支付");
        if (money < 20.0D) {
    
    
            System.out.println("小于最小支付");
        }
        return true;
    }
}

微信支付继承类,实现callPay(money)抽象方法,说明支付不能大于20元

package com.template.concrete;

import com.template.AbstractPay;

public class WeChatPay extends AbstractPay {
    
    
    protected boolean callPay(double money) {
    
    
        System.out.println("微信支付");
        if (money > 20.0D) {
    
    
            System.out.println("超出最大支付了");
        }
        return true;
    }
}

再写一个静态工厂模式创建对象

package com.template.factory;

import com.template.AbstractPay;
import com.template.concrete.AliPay;
import com.template.concrete.WeChatPay;

public class PayFactory {
    
    
    public static AbstractPay getAbstractPay(String payCode) {
    
    
        switch (payCode) {
    
    
            case "ali_pay":
                return new AliPay();
            case "weChat_pay":
                return new WeChatPay();
            default:
                return null;
        }
    }
}

在这里插入图片描述
优点:

模板方法模式是通过把不变的行为挪到一个统一的父类,从而达到去除子类中重复代码的目的、子类实现模板父类的某些细节,有助于模板父类的扩展,通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开闭原则”。

缺点

子类执行的结果影响了父类的结果,会增加代码阅读的难度。

使用场景

多个功能有共同的行为操作。

猜你喜欢

转载自blog.csdn.net/liuqi199707/article/details/109031303