一、前言:
在生活中,完成某件事情是需要多个步骤的,比如淘宝购物粗略分为:登录,选择商品,付款这三个步骤。对于登录和付款这两个步骤而言,用户的使用都是一样的操作,不同的地方在于挑选商品不一致。
软件开发中也是一样,有的类的某个方法的实现,需要几个固定的步骤完成,对于该类的不同对象,有的步骤是不变的,有的步骤是大相径庭的,有的步骤可变可不变。这种情况就适用于模板设计模式。
二、定义:
定义一个操作某种算法的框架,将一些步骤延迟到子类中。模板方法模式使得子类在不改变一个算法框架的前提下,对某个步骤实现个性化定义。
三、构成:
模板设计模式中有两类方法:一种是模板方法,一种是步骤方法。模板方法即某种算法的方法步骤,都是通过调用步骤方法完成的;步骤方法即模板方法的每个阶段性方法,每个步骤方法完成某一特定的、完成总算法的一部分功能。步骤方法有三种类型:抽象方法(子类必须实现的方法,子类必须对其完成个性化定义)、最终方法(所有子类都是一样的)、钩子方法(父类给出默认实现,子类也可以重写的方法)。
四、需求:
还是前言中的那样,假设用户只能通过一种方式登录,必须自定义选择商品以及可以选择支付方式~
五、项目结构:
扫描二维码关注公众号,回复:
2543970 查看本文章
六、详细代码:
1、模板类 Shopping:
package me.ele.template; /** * @author LZJ * @create 2018-07-20 21:25 **/ public abstract class Shopping { /** * 模板方法 */ public void byGoods() { login(); selectGoods(); pay(); } /** * 子类不能重写的方法(最终方法;用户只能这样登录) */ public final void login() { System.out.println("必须通过用户名密码登录"); } /** * 子类必须重写的方法 (抽象方法在本例子中,每个用户都有自己自定义的选择方式) */ protected abstract void selectGoods(); /** * 子类可以重写也可以不重写 (钩子方法;用户可以使用其他方式登录) */ public void pay() { System.out.println("默认使用支付宝支付"); } }
2、模板实现类 UserShopping1
package me.ele.template; /** * @author LZJ * @create 2018-07-20 21:34 **/ public class UserShopping1 extends Shopping { protected void selectGoods() { String name = getClass().getName(); name = name.substring(name.lastIndexOf(".") + 1); System.out.println(name + "选择了一件以纯T恤衫"); } }
3、模板实现类 UserShopping2
package me.ele.template; /** * @author LZJ * @create 2018-07-20 21:34 **/ public class UserShopping2 extends Shopping { protected void selectGoods() { String name = getClass().getName(); name = name.substring(name.lastIndexOf(".") + 1); System.out.println(name + "购买了一双耐克鞋"); } @Override public void pay() { System.out.println("嘿嘿,我选择使用了银行卡支付"); } }
4、测试类
package me.ele.template; /** * @author LZJ * @create 2018-07-20 21:36 **/ public class Test { public static void main(String[] rgs){ UserShopping1 userShopping1 = new UserShopping1(); UserShopping2 userShopping2 = new UserShopping2(); userShopping1.byGoods(); System.out.println("--------分开--------"); userShopping2.byGoods(); } }
5、结果: