模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,而后声明一些抽象方法来迫使子类实现剩余的逻辑。不一样的子类能够以不一样的方式实现这些抽象方法,从而对剩余的逻辑有不一样的实现。这就是模板方法模式的用意。算法
例如: 在现实生活中,完成某件事情是须要 n 个固定步骤的。如"在淘宝进行购物"这件事情的完成通常须要三个步骤: 登陆网站、挑选商品、 付款。但对于登陆网站与付款这两步,每一个人几乎都是相同的操做。但不一样的地方是,每一个人所挑选的商品是不一样的。 在软件开发过程当中一样存在这样的状况。某类的某个方法的实现,须要几个固定步骤。在这些固定步骤中,对于该类的不一样对象, 有些步骤的实现是固定不变的,有些步骤的实现是截然不同的,有些步骤的实现是可变可不变的。对于这种状况,就适合使用模板方法设计模式编程。
基本结构:编程
在模板方法设计模式中,存在一个父类(通常是抽象的)。其中包含 两类方法: 模板方法 和 3 种步骤方法;设计模式
结构:bash
实如今网站上购物的案例。
基本逻辑图:ide
代码:函数
首先看Shopping
类:测试
public abstract class Shopping {
// 模板方法
public void buyGoods(){
useLogin(); //固定的方法,子类不能重写
buy(); //抽象方法,子类必须实现
pay(); //钩子方法(hook),子类能够重写
}
// 固定方法(最终方法)
public final void useLogin() {
System.out.println("用户登陆");
}
//抽象方法
public abstract void buy();
// 钩子方法
public void pay(){
System.out.println("使用银联支付");
}
}复制代码
而后是两个子类:网站
public class ShoesShopping extends Shopping {
@Override
public void buy() {
System.out.println("购买Nike鞋子!!!!");
}
}
public class ClothesShopping extends Shopping {
@Override
public void buy() {
System.out.println("购买海澜之家男装!!!!!");
}
// 重写了钩子方法
@Override
public void pay() {
System.out.println("使用支付宝支付");
}
}复制代码
测试:spa
public class MyTest {
public static void main(String[] args){
Shopping shoesShopping = new ShoesShopping();
shoesShopping.buyGoods();
System.out.println("-----------------------");
Shopping clothesShopping = new ClothesShopping();
clothesShopping.buyGoods();
}
}复制代码
输出:设计
用户登陆
购买Nike鞋子!!!!
使用银联支付
-----------------------
用户登陆
购买海澜之家男装!!!!!
使用支付宝支付复制代码
有时候为了防止恶意操做,模板方法也会加上 final
关键词。