您的位置:首页 > 其它

[工作中的设计模式]模板模式

2016-01-29 00:15 369 查看
一、模式解析

  准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意

  模板模式的关键点为:

  1、有一个父类,将整体业务逻辑和公用方法进行封装;

  2、父类将具体的有差异的业务定义为抽象方法;

  3、子类继承父类后,实现这些抽象方法,完成对自己业务流程的;

  4、子类不可以改变父类的整体业务逻辑流程;

  5、子类也可以覆盖父类中其他方法,实现定制化业务

二、模式代码

父类抽象类

package template.patten;

public abstract class AbstractTemplate {
//业务逻辑执行
public void templateMethod(){
abstractMethod();
hookMethod();
concreteMethod();
}
//抽象方法,需要子类进行覆盖
protected abstract void abstractMethod();

//钩子方法,可以被子类覆盖
protected void hookMethod() {
System.out.println("我是模板中的hook方法");
}
//父类的具体方法,不可以被重写
private void concreteMethod(){
System.out.println("我是父类的具体方法不能被重写");
}

}


子类实现具体业务逻辑

package template.patten;

public class ConcreteTemplate extends AbstractTemplate {

@Override
public void hookMethod() {
System.out.println("先调用子类实现的hookmethod,然后再调用父类的方法");
super.hookMethod();
}

@Override
protected void abstractMethod() {
System.out.println("抽象方法的具体实现");
}
}


客户端调用

package template.patten;

public class Client {
public static void main(String[] args) {
AbstractTemplate template=new ConcreteTemplate();
template.templateMethod();
}
}


三、应用场景

目前工作中,对业务功能的实现主要依赖于模板模式的定义,将所有业务分为几种模板进行定义:

1、查询模板

2、界面初始化模板

3、空模板

4、两步模板

其中两步模板最为复杂,依次举例说明

两步模板-工作中常用的模板之一,主要用于需要修改数据的交易,假设通常内部操作为如下步骤
1、检查数据正确性
2、记录交易日志,将状态修改为进行中
3、进行交易操作
4、根据交易结果,修改交易日志

那么对于一个功能来讲,记录日志和修改交易结果为相对固定的操作,因此封装在模板里,检查交易正确性和进行交易每个交易均不同,所以需要由具体功能进行实现

四、应用代码

package template.example;
/**
* @author zjl
* @time 2016-1-28
*
*/
public abstract class TwoPhaseTrsTemplate {
public void execute() {
prepare();
preAction();
submit();
afterAction();
}
public abstract void prepare();
public abstract void submit();
private void preAction(){
System.out.println("交易开始,交易状态为进行中,记录交易日志");
}
private void afterAction(){
System.out.println("交易成功,更新交易日志状态为成功");
}
}


具体交易,以转账为例:

package template.example;

public class Transfer extends TwoPhaseTrsTemplate {

@Override
public void prepare() {
System.out.println("检查所有转账元素");
}

@Override
public void submit() {
System.out.println("转账操作,银行核心进行扣帐操作");

}

}


客户端调用

package template.example;

public class Client {
public static void main(String[] args) {
Transfer transfer=new Transfer();
transfer.execute();
}
}


执行结果:

检查所有转账元素
交易开始,交易状态为进行中,记录交易日志
转账操作,银行核心进行扣帐操作
交易成功,更新交易日志状态为成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: