泛型模板化设计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. 独家深度 | 一文看懂 ClickHouse vs Elasticsearch:谁更胜一筹?

    简介: 本文的主旨在于通过彻底剖析ClickHouse和Elasticsearch的内核架构,从原理上讲明白两者的优劣之处,同时会附上一份覆盖多场景的测试报告给读者作为参考. 作者:阿里云数据库OLA ...

  2. 基于Python语言的数据可视化工具

    在数据分析中常用的图表可以使用使用 python语言的 matplotlib 和 seaborn 库选择要显示的可视化对象. 一.Matplotlib Matplotlib 是一个 Python 的 ...

  3. [Gin] 路由分组 Group 的内部实现 与 块空间 { } 的应用

    通过这篇 [Gin] 单文件极简 HTTP Server 流程分析 ( gin-gonic/gin ) 我们知道了 gin.go 中的 Engine 继承有 routergroup.go 中的 Rou ...

  4. dotnet 6 为什么网络请求不跟随系统网络代理变化而动态切换代理

    本文记录在 dotnet 6 的网络和在 .NET Framework 的行为的变更.在 dotnet 6 下,默认的网络请求在系统网络代理变更的时候,是不会动态切换代理的.例如在应用运行进行网络通讯 ...

  5. 【Nano Framework ESP32篇】使用 LCD 屏幕

    在开始主题之前,先介绍一个刷固件工具.这个工具在 idf 中是集成的,不过,乐鑫也单独发布了这个工具-- esptool.下载链接:Releases · espressif/esptool · Git ...

  6. 大模型高效微调详解-从Adpter、PrefixTuning到LoRA

    一.背景 目前NLP主流范式是在大量通用数据上进行预训练语言模型训练,然后再针对特定下游任务进行微调,达到领域适应(迁移学习)的目的. 指令微调是预训练语言模型微调的主流范式 其目的是尽量让下游任务的 ...

  7. 03.redis 事务

    课程学习地址: https://www.bilibili.com/video/BV1S54y1R7SB?p=23 中间手册地址: http://www.redis.cn/ Redis事务本质:一组命令 ...

  8. three.js案例-web3d三维地图大屏炫酷3D地图下钻地图-附源码

    炫酷3D地图效果如下: 代码注释非常详细: create() { // 添加雾,随着距离线性增大,只能看到一个小是视野范围内的场景,地图缩小很多东西就会看不清 //this.scene.fog = n ...

  9. [popover, select] el-popover内有select的时候在选择后会自动关闭

    Steps to reproduce 选择某个选项后会自动关闭 What is Expected? 选择后不自动关闭,等点击按钮后再去触发组件内的关闭方法. What is actually happ ...

  10. 【C# wpf】个人网盘练习项目总结

    采用 .net frameowrok 4.5.2 未写持久层代码,不可保存运行时的数据状态.分服务端,客户端,采用tcp通讯,使用了supersocket组件.服务端用winform ,客户端用wpf ...