模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
个人理解: 模板方法就是将一系列行为抽象到父类中,形成流水线一样得操作, 这一系列行为有的是通用得,有的是有差异的;
通用的就在抽象父类中写具体实现, 有差异的行为就放到子类中去具体实现,总之, 流水线是统一的;
模板方法模式包含如下两个角色:
① AbstractClass(抽象父类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
② ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
例子:这是抽象父类,流水线操作为, 用户登录(统一行为)-> 用户操作(差异行为)->用户退出(统一行为);定义了模板统一的方法,和抽象方法
/**
* anji-allways.com Inc.
* Copyright (c) 2016-2017 All Rights Reserved.
*/
package boot.demo.formwork;
/**
* <pre>
* 模板方法模式
* </pre>
*
* @author sxl
* @version $Id: UserOperation.java, v 0.1 2019年8月12日 上午8:49:05 sxl Exp $
*/
abstract class UserOperation {
/**
* <pre>
* 统一操作登录
* </pre>
*
*/
public void login() {
System.out.println("用户登录成功!!!");
}
/**
* <pre>
* 统一操作退出
* </pre>
*
*/
public void Exit() {
System.out.println("用户退出成功!!!");
}
/**
* <pre>
* 抽象操作(每个用户的具体行为)
* </pre>
*
*/
public abstract void operation();
/**
* <pre>
* 模板操作
* </pre>
*
*/
public void formwork () {
this.login();
this.operation();
this.Exit();
}
}
这是具体实现A类 ,定义了a的差异行为
/**
* anji-allways.com Inc.
* Copyright (c) 2016-2017 All Rights Reserved.
*/
package boot.demo.formwork;
/**
* <pre>
* UserA
* </pre>
*
* @author sxl
* @version $Id: UserA.java, v 0.1 2019年8月12日 上午8:54:47 sxl Exp $
*/
public class UserA extends UserOperation {
/**
* @see boot.demo.formwork.UserOperation#operation()
*/
@Override
public void operation() {
System.out.println("这是A用户的具体行为!!!");
}
}
这是具体实现B类
/**
* anji-allways.com Inc.
* Copyright (c) 2016-2017 All Rights Reserved.
*/
package boot.demo.formwork;
/**
* <pre>
* UserB
* </pre>
*
* @author sxl
* @version $Id: UserB.java, v 0.1 2019年8月12日 上午8:56:07 sxl Exp $
*/
public class UserB extends UserOperation {
/**
* @see boot.demo.formwork.UserOperation#operation()
*/
@Override
public void operation() {
System.out.println("这是B用户的具体行为!!!");
}
}
测试类
/**
* anji-allways.com Inc.
* Copyright (c) 2016-2017 All Rights Reserved.
*/
package boot.demo.formwork;
/**
* <pre>
*
* </pre>
*
* @author sxl
* @version $Id: Demo.java, v 0.1 2019年8月12日 上午8:58:04 sxl Exp $
*/
public class Demo {
public static void main(String[] args) {
UserA u = new UserA();
u.formwork();
UserB u2 = new UserB();
u2.formwork();
}
}
结果如下:
用户登录成功!!!
这是A用户的具体行为!!!
用户退出成功!!!
用户登录成功!!!
这是B用户的具体行为!!!
用户退出成功!!!