设计模式总结:模板方法

栏目: 后端 · 发布时间: 7年前

内容简介:模板方法属于行为型设计模式,在父类中定义处理流程的框架,在子类中实现具体的处理在父类(抽象类)中定义好算法的流程,提供抽象方法,针对不同的实现交由不同的子类去实现,通过这种方式将公共代码提取出来封装在父类中,然后父类去控制行为,子类负责实现,这样当有很多子类的时候,如果要修改算法,只需要在父类中更改算法的行为即可。已支付为例,涉及AbstractPay,BankCardPay,WeChatPay三个类。

模板方法属于行为型设计模式,在父类中定义处理流程的框架,在子类中实现具体的处理

什么是模板方法

在父类(抽象类)中定义好算法的流程,提供抽象方法,针对不同的实现交由不同的子类去实现,通过这种方式将公共代码提取出来封装在父类中,然后父类去控制行为,子类负责实现,这样当有很多子类的时候,如果要修改算法,只需要在父类中更改算法的行为即可。

实现

已支付为例,涉及AbstractPay,BankCardPay,WeChatPay三个类。

AbstractPay

抽象类(父类),定义了三个抽象方法和一个控制支付流程的方法,也就是模板方法,这个方法使用final修饰,防止被重写

/**
 * @auther: chenmingyu
 * @date: 2019/2/13 16:58
 * @description: 抽象类,定义支付流程
 */
public abstract class AbstractPay {

    /**
     * 获取支付信息
     */
    abstract String getPayInfo();

    /**
     * 执行支付
     */
    abstract void executePay();

    /**
     * 支付反馈信息
     */
    abstract void payMessage();

    /**
     * 支付
     */
    public final void pay(){
        String info = getPayInfo();
        System.out.println("支付账户:"+info);
        executePay();
        payMessage();
    }
}

BankCardPay

子类实现,提供银行卡支付,继承AbstractPay类重写三个抽象方法,提供银行卡支付的实现

/**
 * @auther: chenmingyu
 * @date: 2019/2/13 17:18
 * @description: 银行卡支付
 */
public class BankCardPay extends AbstractPay{

    @Override
    String getPayInfo() {
        return "我的银行卡信息";
    }

    @Override
    void executePay() {
        System.out.println("银行卡支付了");
    }

    @Override
    void payMessage() {
        System.out.println("银行卡方式支付,发短息");
    }
}

WeChatPay

子类实现,提供微信支付,继承AbstractPay类重写三个抽象方法,提供微信支付的实现

/**
 * @auther: chenmingyu
 * @date: 2019/2/13 17:20
 * @description: 微信支付
 */
public class WeChatPay extends AbstractPay{

    @Override
    String getPayInfo() {
        return "我的微信支付信息";
    }

    @Override
    void executePay() {
        System.out.println("微信支付了");
    }

    @Override
    void payMessage() {
        System.out.println("微信方式支付,微信内发服务通知");
    }
}

测试

public static void main(String[] args) {
    BankCardPay bankCardPay = new BankCardPay();
    bankCardPay.pay();
    System.out.println("... 分割线 ...");
    WeChatPay weChatPay = new WeChatPay();
    weChatPay.pay();
}

输出

支付账户:我的银行卡信息
银行卡支付了
银行卡方式支付,发短息
... 分割线 ...
支付账户:我的微信支付信息
微信支付了
微信方式支付,微信内发服务通知

总结一下,就是抽象类封装了一个final类型的方法,方法中调用其他的抽象方法,制定业务流程,提供的抽象方法交由子类去实现。当你有多个子类实现逻辑相同时,建议使用模板方法。


以上所述就是小编给大家介绍的《设计模式总结:模板方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Mechanics of Web Handling

The Mechanics of Web Handling

David R. Roisum

This unique book covers many aspects of web handling for manufacturing, converting, and printing. The book is applicable to any web including paper, film, foil, nonwovens, and textiles. The Mech......一起来看看 《The Mechanics of Web Handling》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换