模板方法属于行为型设计模式,在父类中定义处理流程的框架,在子类中实现具体的处理java
推荐访问个人我的网站,排版更好看呦:
https://chenmingyu.top/design-template-method/算法
在父类(抽象类)中定义好算法的流程,提供抽象方法,针对不一样的实现交由不一样的子类去实现,经过这种方式将公共代码提取出来封装在父类中,而后父类去控制行为,子类负责实现,这样当有不少子类的时候,若是要修改算法,只须要在父类中更改算法的行为便可。设计模式
已支付为例,涉及AbstractPay,BankCardPay,WeChatPay三个类。微信
抽象类(父类),定义了三个抽象方法和一个控制支付流程的方法,也就是模板方法,这个方法使用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(); } }
子类实现,提供银行卡支付,继承AbstractPay类重写三个抽象方法,提供银行卡支付的实现ide
/** * @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("银行卡方式支付,发短息"); } }
子类实现,提供微信支付,继承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类型的方法,方法中调用其余的抽象方法,制定业务流程,提供的抽象方法交由子类去实现。当你有多个子类实现逻辑相同时,建议使用模板方法。网站