泛型模板化设计DEMO

1. 定义Result泛型类

package com.example.core.mydemo.java.fanxing;

public class Result<T> {
T response; public T getResponse() {
return response;
} public void setResponse(T response) {
this.response = response;
} }

2.定义了程序的主要实现流程

package com.example.core.mydemo.java.fanxing;

public abstract class BaseService<T> {
/**
* 定义了程序的主要实现流程-骨架
* @return
*/
public Result handle(BaseRequest request) throws Exception{
Result result = new Result();
method1();
// result.setResponse(method2()); /**
* request与response对象的绑定关系
*/
Class<T> responseClass = request.getResponseClass();
T rspt = null;
rspt = responseClass.newInstance(); rspt = method2();
result.setResponse(rspt);
return result;
} /**
* 返回值-泛型,根据不同的业务返回不同的响应类型
* @return
*/
private T method2() {
T response = initResponse();//获取子类初始化的响应实例
System.out.println("BaseService method2");
return response;
} /**
* 公共处理业务
*/
private void method1() {
System.out.println("BaseService method1");
} /**
* 响应类型-泛型,提供出去给具体实现类进行初始化
* @return
*/
protected abstract T initResponse();
}

3.请求基类和返回基类

package com.example.core.mydemo.java.fanxing;

public interface BaseRequest<T extends BaseResponse> {

    Class<T>  getResponseClass();

}

package com.example.core.mydemo.java.fanxing;

public class BaseResponse {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

4.第一个实现类

package com.example.core.mydemo.java.fanxing;

public class ChinaRequest implements BaseRequest<ChinaResponse>{

    @Override
public Class<ChinaResponse> getResponseClass() {
return ChinaResponse.class;
} } package com.example.core.mydemo.java.fanxing; import java.util.List; public class ChinaResponse extends BaseResponse{
List<String> province; public List<String> getProvince() {
return province;
} public void setProvince(List<String> province) {
this.province = province;
} } package com.example.core.mydemo.java.fanxing; import java.util.Arrays; public class ChinaServiceImpl extends BaseService<ChinaResponse>{ /**
* 实现抽象方法,初始化返回值类型
* @return
*/
@Override
protected ChinaResponse initResponse() {
ChinaResponse chinaResponse = new ChinaResponse();
chinaResponse.setName("中国");
chinaResponse.setProvince(Arrays.asList("湖南","山东"));
return chinaResponse;
} }

5.第二个实现类

package com.example.core.mydemo.java.fanxing;

public class AmericaRequest implements BaseRequest<AmericaResponse>{

    @Override
public Class<AmericaResponse> getResponseClass() {
return AmericaResponse.class;
}
} package com.example.core.mydemo.java.fanxing; import java.util.List; public class AmericaResponse extends BaseResponse{
List<String> state; public List<String> getState() {
return state;
} public void setState(List<String> state) {
this.state = state;
} } package com.example.core.mydemo.java.fanxing; import java.util.Arrays; public class AmericaServiceImpl extends BaseService<AmericaResponse> {
/**
* 实现抽象方法,初始化返回值类型
* @return
*/
@Override
protected AmericaResponse initResponse() {
AmericaResponse americaResponse = new AmericaResponse();
americaResponse.setName("美国");
americaResponse.setState(Arrays.asList("纽约","华盛顿"));
return americaResponse;
} }

6.测试类

package com.example.core.mydemo.java.fanxing;

import com.example.core.mydemo.json2.GsonUtils;
import com.google.gson.Gson; /**
* output:
* BaseService method1
* BaseService method2
* {"province":["湖南","山东"],"name":"中国"}
* BaseService method1
* BaseService method2
* {"state":["纽约","华盛顿"],"name":"美国"}
*/
public class FanxingTest {
public static void main(String[] args) {
BaseService<ChinaResponse> baseService = new ChinaServiceImpl();
ChinaRequest chinaRequest = new ChinaRequest();
Result<ChinaResponse> result = null;
try {
result = baseService.handle(chinaRequest);
} catch (Exception e) {
e.printStackTrace();
}
ChinaResponse chinaResponse = result.getResponse();
System.out.println(new Gson().toJson(chinaResponse)); BaseService<AmericaResponse> americaService = new AmericaServiceImpl();
AmericaRequest americaRequest = new AmericaRequest();
Result<AmericaResponse> americaResult = null;
try {
americaResult = americaService.handle(americaRequest);
} catch (Exception e) {
e.printStackTrace();
}
AmericaResponse americaResponse = americaResult.getResponse();
System.out.println(new Gson().toJson(americaResponse));
}
}

泛型模板化设计DEMO的更多相关文章

  1. Android移动应用界面的模板化设计

    Android没有像苹果开发那样功能强大的界面开发工具,本身 ADT插件提供的界面编辑能力有限,没办法刻画所有的界面情况:Android的界面xml代码可以进行人工修改,而Iphone的全部在图形界面 ...

  2. 11款扁平化设计的 Twitter Bootstrap 主题和模板

    扁平化设计和 Bootstrap 框架是2013年网页设计领域的两大设计潮流.把这两者集合起来不是件容易的事情,使用下面这些主题和模板将节省我们的开发时间,因为我们可以修改已有的基础代码,而不是从零开 ...

  3. 16个时髦的扁平化设计的 HTML5 & CSS3 网站模板

    创建网站最好办法之一是使用现成的网站模板或使用开源 CMS 应用程序.所以,今天这篇文章给大家带来的是16款基于 HTML5 & CSS3 的精美的扁平风格网站模板,大家可以借助这些优秀的网站 ...

  4. 利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出

    我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的 ...

  5. 扁平化设计的最新趋势 – 长阴影(Long Shadow)

    随着互联网的发展,网页设计变得越来越复杂,如今设计的外观和感觉实现网站功能说使用的开发技术一样重要.互联网的功能远远不只是基本的信息共享,现在人们对网站的期望是远远大于几年前的. 如今,HTML5 & ...

  6. 10、ERP设计之系统基础管理(BS)- 平台化设计

    ShareERP 2013-09-03 ERP业务平台化是每个软件提供商必须要进行的趋势,传统定制化路线已死,不能走定制化的老路了.以往最大问的题是不能累积和沉淀技术及提升项目业务管理能力,其次是管理 ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  8. 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字

    1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...

  9. java接口入参模板化,适用于企业化服务远程调度模板化的场景,接口入参实现高度可配置化

    需求:远程服务接口模板化配置提供接入服务 模板接口分为三个模块:功能路由.参数校验.模板入库 路由:这里的实现方式很简单,就是根据业务标识找到对应的处理方法 参数校验: 参数校验这步涉及模板和校验类两 ...

  10. ASP.NET:MVC模板化机制

    模版化的核心是定制ViewEngine.完整的模板化必须实现3个功能:1.网站的多套模版(razor)支持 2.模版的多样式(style)支持. 3.按需实现模版:没有实现的加载默认模版. 我们除了要 ...

随机推荐

  1. 殷浩详解DDD:如何避免写流水账代码?

    简介: 在日常工作中我观察到,面对老系统重构和迁移场景,有大量代码属于流水账代码,通常能看到开发在对外的API接口里直接写业务逻辑代码,或者在一个服务里大量的堆接口,导致业务逻辑实际无法收敛,接口复用 ...

  2. Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS

    ​简介:Jenkins 由于其开源特性以及丰富插件能力,长久以来都是中小企业搭建 CICD 流程的首选.不过 Jenkins 存在维护成本高.配置复杂等缺点,云效 Flow 较好地解决了这些问题. 本 ...

  3. ACMMM2021|在多模态训练中融入“知识+图谱”:方法及电商应用实践

    ​简介: 随着人工智能技术的不断发展,知识图谱作为人工智能领域的知识支柱,以其强大的知识表示和推理能力受到学术界和产业界的广泛关注.近年来,知识图谱在语义搜索.问答.知识管理等领域得到了广泛的应用. ...

  4. 庖丁解牛-图解MySQL 8.0优化器查询转换篇

    ​简介: 在<庖丁解牛-图解MySQL 8.0优化器查询解析篇>一文中我们重点介绍了MySQL最新版本8.0.25关于SQL基本元素表.列.函数.聚合.分组.排序等元素的解析.设置和转换过 ...

  5. 基于 MaxCompute 的实时数据处理实践

    ​简介: MaxCompute 通过流式数据高性能写入和秒级别查询能力(查询加速),提供EB级云原生数仓近实时分析能力:高效的实现对变化中的数据进行快速分析及决策辅助.当前Demo基于近实时交互式BI ...

  6. [ELK] Elastic Stack 的安全性预览

    注:ELK Stack 之后的版本都叫做 Elastic Stack,增加了 Beats 等组件. 安全性保护方式: 阻止未授权的访问,通过 密码认证保护.RBAC授权.IP 过滤. 保证数据完整性, ...

  7. Roslyn 将构建时间写入到输出文件

    我期望在每次构建完成之后,创建一个文件,在这个文件里面写入是什么时间构建的.这个需求实现非常简单,只需要使用 Target 在构建完成,使用 WriteLinesToFile 方法写入时间到输出文件即 ...

  8. Multisim14.0安装步骤

    免责声明:以下图片资源来源于Internet,作搜集学习之用.   此处,若只用到multisim仿真,可以只选择multisim 14.0 下面的education edition.

  9. vue中vant-list组件实现下拉刷新,上滑加载

    后端返回的数据是一股脑的情况(不是按pageSize,pageNum一组一组的发送)时,前端使用vant-list实现懒加载需要再写一点js,记录一下 main.js: Vue.use(List); ...

  10. telegraph + influxdb + grafana 实现交换机流量展示

    实验环境 influxdb2:2.7.5 telegraf:1.30.1 grafana:10.4.2 influxdb 官方文档见https://docs.influxdata.com/influx ...