首页 > 其他分享 >泛型模板化设计DEMO

泛型模板化设计DEMO

时间:2024-04-21 14:12:11浏览次数:29  
标签:core return DEMO mydemo 泛型 java com public 模板

泛型模板化设计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));
    }
}

 

标签:core,return,DEMO,mydemo,泛型,java,com,public,模板
From: https://www.cnblogs.com/oktokeep/p/18148880

相关文章

  • 泛型模板化设计使用-订单搜索接口
    泛型模板化设计使用-订单搜索接口1.定义订单搜索接口packagecom.example.core.mydemo.java.templateQuery;//暂不使用该接口//publicinterfaceSearchService<TextendsBaseRequest,FextendsBaseResponse>{publicinterfaceSearchService<T,F>{/***订单......
  • 小记 Demo
    定义领域模型:AggregateRoot:定义SalesOrder作为聚合根,其中包括订单明细、客户信息、订单总额等。Entity:定义如OrderItem(订单项)、Inventory(库存)等实体。ValueObject:定义如Address(地址)、Money(金额)等值对象。建立仓储接口:使用ABPvNext框架的仓储模式来实现数据的......
  • 接口加密传输设计及AES加解密代码DEMO
    接口加密传输设计及AES加解密代码DEMO接口加密的方案设计:可以将请求的json字符串aes加密,通过params字段传输,接口服务端接收到参数,先解密,然后转换成对象。继续业务逻辑的处理。(另外一种方案是:针对敏感字段aes加密,服务接收端对敏感字段来解密处理)RequestVo对象:privateS......
  • 模板匹配
    1.模板匹配步骤模板匹配是一种基于图像的技术,用于在图像中寻找与给定模板图像相似的部分。由于模板图像的尺寸小于待匹配图像的尺寸,同时又需要比较两幅图像的每一个像素的灰度值,因此常采用在待匹配图像中选择与模板相同的尺寸的滑动窗口,通过比较滑动窗口与模板的相似程度,判......
  • 如何创建响应式HTML电子邮件模板
    在这个适合初学者的指南中,你将学习如何创建一个响应式电子邮件模板。你将跟随逐步说明以及代码片段设计一个在任何设备上都看起来很棒的电子邮件模板。这个项目非常适合渴望掌握电子邮件设计基础的新手!(本文视频讲解:java567.com)步骤1:设置基本结构要构建一个电子邮件模板,你可以......
  • 09-权限介绍和后台模板的使用
    权限介绍#1写过权限类---》控制用户,是否有权限访问我们的接口#2之前咱们直接定死,普通用户,超级用户,管理员这种身份,给不同人设置不同权限#3比如都是互联网用户:抖音acl控制 -游客用户只能查看-登陆用户可以查看和评论-粉丝超过1000用户,开直播#4公司......
  • 项目新建模板
    pom<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org......
  • React 简单登录平台Demo(2):使用Anti写登录框架
    目录前言参考登录页面基础框架layout.tsxpage.tsxTailWind使用好看的渐变颜色flex布局填充布局居中布局显示效果总结前言在适用了一下Anti之后发现,学起来成本实在太高了,先用Anti默认的目标凑合一下好了。反正我也就是一个普通的后端,能用React写就不错了,样式凑合凑合能用就行。......
  • Springboot 下载模板
    文件路径在项目的resources下面  路径 resources/tempExcel/导入模板.xlsx后端代码:/***下载模板**@paramresponse*@throwsIOException*/@RepeatSubmit@PostMapping("/download/template")publicvoiddownloadTemplate(HttpServletResponseresponse)throws......
  • React 简单登录平台Demo(1):Next.js配置
    目录前言体验Next.js中文文档路径问题创建项目启动报错测试TailWindCSS热重载如何添加路由第三方库引入tailwindcss配置相关链接布局新建布局布局也是嵌套影响的根节点layout配置路由跳转Link跳转Hook跳转简单的登录页面前言我之前的那个项目写到后面,发现还不如直接用Next.js呢......