1. 模板方法模式

1. 模板方法模式

      模板方法模式,点睛之笔在“模板”二字,模板是什么,它是一个标准的,固定的流程。抽象模板定义出流程,子类实现具体的流程步骤,由此实现“千人千面”的效果。

2. 模板方法模式优缺点

2.1 优点

  1. 封装了不变部分,可变部分由子类扩展。
  2. 公共代码提取到父类中,提高了代码的复用性。
  3. 子类扩展父类,符合开闭原则。

2.2 缺点

  1. 模板不能变,模板一旦增加了抽象方法,所有的子类都要跟着变。

3. 模板方法模式举例

3.1 举例说明及类图

      用服务调用举个例子。
      服务调用一共可以分三步,第一步,验证入参;第二步,调用服务;第三步,组装结果。整个调用过程是一个标准处理流程,我们可以用模板方法模式抽象出这个流程,让不同的接口实现具体的流程步骤。
在这里插入图片描述

3.2 代码实现

      从类图上可以看出,模板方法模式主要分为两部分,第一部分是抽象的模板,第二部分是具体的模板实现。我们通过代码模拟一下。
      第一部分,定义出抽象模板:

public abstract class ServiceTemplate {

    protected abstract boolean checkPara(Object request);
    protected abstract Object callService(Object request);
    protected abstract Object assemblyResult(Object response);
    
    public Object doService(Object request) {
        if(checkPara(request)) {
            Object response = callService(request);
            return assemblyResult(response);
        } else {
            return Boolean.FALSE;
        }
    }
}

      第二部分,定义出具体业务服务A:

public class ServiceA extends ServiceTemplate{
    @Override
    protected boolean checkPara(Object request) {
        System.out.println("check para in service A");
        return Boolean.TRUE;
    }

    @Override
    protected Object callService(Object request) {
        System.out.println("call service in service A");
        return null;
    }

    @Override
    protected Object assemblyResult(Object response) {
        System.out.println("assembly result in service A");
        return "service A done";
    }
}

      定义出具体业务服务B:

public class ServiceB extends ServiceTemplate{
    @Override
    protected boolean checkPara(Object request) {
        System.out.println("check para in service B");
        return Boolean.TRUE;
    }

    @Override
    protected Object callService(Object request) {
        System.out.println("call service in service B");
        return null;
    }

    @Override
    protected Object assemblyResult(Object response) {
        System.out.println("assembly result in service B");
        return "service B done";
    }
}

      MainClass 调用下:

public class Main {
    public static void main(String[] args) {
        Object request = new Object();
        ServiceTemplate templateA = new ServiceA();
        templateA.doService(request);
        System.out.println("================================");
        ServiceTemplate templateB = new ServiceB();
        templateB.doService(request);
    }
}

调用结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值