一、前言:
在生活中,完成某件事情是需要多个步骤的,比如淘宝购物粗略分为:登录,选择商品,付款这三个步骤。对于登录和付款这两个步骤而言,用户的使用都是一样的操作,不同的地方在于挑选商品不一致。
软件开发中也是一样,有的类的某个方法的实现,需要几个固定的步骤完成,对于该类的不同对象,有的步骤是不变的,有的步骤是大相径庭的,有的步骤可变可不变。这种情况就适用于模板设计模式。
二、定义:
定义一个操作某种算法的框架,将一些步骤延迟到子类中。模板方法模式使得子类在不改变一个算法框架的前提下,对某个步骤实现个性化定义。
三、构成:
模板设计模式中有两类方法:一种是模板方法,一种是步骤方法。模板方法即某种算法的方法步骤,都是通过调用步骤方法完成的;步骤方法即模板方法的每个阶段性方法,每个步骤方法完成某一特定的、完成总算法的一部分功能。步骤方法有三种类型:抽象方法(子类必须实现的方法,子类必须对其完成个性化定义)、最终方法(所有子类都是一样的)、钩子方法(父类给出默认实现,子类也可以重写的方法)。
四、需求:
还是前言中的那样,假设用户只能通过一种方式登录,必须自定义选择商品以及可以选择支付方式~
五、项目结构:
六、详细代码:
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、结果: