模式介绍
通过抽象类定义了一个模板,子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
示例(购买商品)
购买商品的过程都会经过选择商品,支付,物流,签收。
首先定义一个购买商品流程的抽象类
public abstract class BaseBuyGoodsTemplate {
/**
* 商品选择
*
* @return
*/
protected abstract void chooseGoods();
/**
* 商品支付
*
* @return
*/
protected abstract void payGoods();
/**
* 商品邮寄
*
* @return
*/
protected abstract void postGoods();
/**
* 商品签收
*
* @return
*/
protected abstract void receiveGoods();
public final void buyGoods() {
chooseGoods();
payGoods();
postGoods();
receiveGoods();
}
}
A平台购买商品
@Service
public class ABuyGoodsImpl extends BaseBuyGoodsTemplate {
@Override
protected void chooseGoods() {
System.out.println("A平台选择商品");
}
@Override
protected void payGoods() {
System.out.println("A平台支付商品");
}
@Override
protected void postGoods() {
System.out.println("A平台邮寄商品");
}
@Override
protected void receiveGoods() {
System.out.println("A平台签收商品");
}
}
B平台购买商品
@Service
public class BBuyGoodsImpl extends BaseBuyGoodsTemplate {
@Override
protected void chooseGoods() {
System.out.println("B平台选择商品");
}
@Override
protected void payGoods() {
System.out.println("B平台支付商品");
}
@Override
protected void postGoods() {
System.out.println("B平台邮寄商品");
}
@Override
protected void receiveGoods() {
System.out.println("B平台签收商品");
}
}
测试
public static void main(String[] args) {
BaseBuyGoodsTemplate a = new ABuyGoodsImpl();
a.buyGoods();
BaseBuyGoodsTemplate b = new BBuyGoodsImpl();
b.buyGoods();
}
优缺点
优点
- 将不变的部分进行封装,可变的部分可自行扩展;
- 提取公共代码,开发人员维护比较方便。
- 由父类控制行为,子类实现。
缺点
每一个实现都需要一个子类,后期系统会越来越庞大