高复用服务响应对象的设计思想以及抽象封装

wx5cb71f4b705da wx5cb71f4b705da     2022-11-29     151

关键词:


1. 用途

作为控制层统一返回对象

2. 参数

status:状态 int

  • msg:返回信息 String
  • data:范型对象 T
;
//返回信息
private String msg;
//返回对象
private T data;

3. 私有构造器

(int status)
this.status = status;


/**
* 私有构造器,在调用公共方法时,使用
* @param status
* @param msg
*/
private ServerResponse(int status, String msg)
this.status = status;
this.msg = msg;


/**
* 私有构造器,在调用公共方法时,使用
* @param status
* @param data
*/
private ServerResponse(int status, T data)
this.status = status;
this.data = data;


/**
* 私有构造器,在调用公共方法时,使用
* @param status
* @param msg
* @param data
*/
private ServerResponse(int status, String msg, T data)
this.status = status;
this.msg = msg;
this.data = data;
  • 疑问
(int status, T data)
// 和ServerResponse(int status, String msd)调用哪一个?
  • 解决
(String[] args)
ServerResponse s1 = new ServerResponse(1, new Object());
ServerResponse s2 = new ServerResponse(1, "ss");
System.out.println("aaa");//加入断点调试
  • 调试结果:

高复用服务响应对象的设计思想以及抽象封装_序列化

4. 设置返回状态码

/**
* 返回状态码
*/
public enum ResponseCode

SUCCESS(0,"SUCCESS"),

ERROR(1,"ERROR"),

NEED_LOGIN(10, "NEED_LOGIN"),

ILLEGAL_ARGUMENT(2, "ILLEGAL_ARGUMENT");


private final int code;

private final String desc;

//必须加上构造器
ResponseCode(int code, String desc)
this.code = code;
this.desc = desc;



public int getCode()
return code;


public String getDesc()
return desc;

5. 设置静态返回方法,包括成功与失败

<T>
* @return
*/
public static <T> ServerResponse<T> createBySuccess()
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode());


/**
* 公共静态成功返回方法
* @param msg
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createBySuccess(String msg)
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg);


/**
* 公共静态成功返回方法
* @param data
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createBySuccess(T data)
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),data);


/**
* 公共静态成功返回方法
* @param msg
* @param data
* @param <T>
* @return
*/
//解决String与data同时传输的问题
public static <T> ServerResponse<T> createBySuccess(String msg, T data)
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg, data);


/**
* 公共静态失败返回方法
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createByError()
return new ServerResponse<T>(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.getDesc());


/**
* 公共静态失败返回方法,返回默认失败信息
* @param msg
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createByError(String msg)
return new ServerResponse<T>(ResponseCode.ERROR.getCode(), msg);


/**
* 公共静态失败返回方法,根据状态码自定义失败信息
* @param code
* @param msg
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createByError(int code,String msg)
return new ServerResponse<T>(code, msg);

6. 公共方法序列化忽略

()
return this.status == ResponseCode.SUCCESS.getCode();

7. 返回NULL字段序列化忽略

/**
* 高复用返回封装对象
* @param <T>
*/
//JSON序列化忽略是NULL的字段,主要是失败时的data不显示
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class ServerResponse<T> implements Serializable

8. 完整代码

package cn.hcnet2006.mmall.mmall.common;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.jsonschema.JsonSerializableSchema;
import org.springframework.web.servlet.function.ServerRequestExtensionsKt;

import java.io.Serializable;

/**
* 高复用返回封装对象
* @param <T>
*/
//JSON序列化忽略是NULL的字段,主要是失败时的data不显示
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class ServerResponse<T> implements Serializable

//返回状态
private int status;
//返回信息
private String msg;
//返回对象
private T data;

/**
* 私有构造器,在调用公共方法时,使用
* @param status
*/
private ServerResponse(int status)
this.status = status;


/**
* 私有构造器,在调用公共方法时,使用
* @param status
* @param msg
*/
private ServerResponse(int status, String msg)
this.status = status;
this.msg = msg;


/**
* 私有构造器,在调用公共方法时,使用
* @param status
* @param data
*/
private ServerResponse(int status, T data)
this.status = status;
this.data = data;


/**
* 私有构造器,在调用公共方法时,使用
* @param status
* @param msg
* @param data
*/
private ServerResponse(int status, String msg, T data)
this.status = status;
this.msg = msg;
this.data = data;


/**
* 公共开放方法
* @return
*/
//序列化不会显示在JSON里面
@JsonIgnore
public boolean isSuccess()
return this.status == ResponseCode.SUCCESS.getCode();

/**
* 公共开放方法
*/
public int getStatus()
return status;

/**
* 公共开放方法
*/
public String getMsg()
return msg;

/**
* 公共开放方法
*/
public T getData()
return data;


/**
* 公共静态成功返回方法
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createBySuccess()
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode());


/**
* 公共静态成功返回方法
* @param msg
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createBySuccess(String msg)
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg);


/**
* 公共静态成功返回方法
* @param data
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createBySuccess(T data)
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),data);


/**
* 公共静态成功返回方法
* @param msg
* @param data
* @param <T>
* @return
*/
//解决String与data同时传输的问题
public static <T> ServerResponse<T> createBySuccess(String msg, T data)
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg, data);


/**
* 公共静态失败返回方法
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createByError()
return new ServerResponse<T>(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.getDesc());


/**
* 公共静态失败返回方法,返回默认失败信息
* @param msg
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createByError(String msg)
return new ServerResponse<T>(ResponseCode.ERROR.getCode(), msg);


/**
* 公共静态失败返回方法,根据状态码自定义失败信息
* @param code
* @param msg
* @param <T>
* @return
*/
public static <T> ServerResponse<T> createByError(int code,String msg)
return new ServerResponse<T>(code, msg);


java基础---抽象和封装

1.为什么使用面向对象?现实世界是由什么组成的,世界由对象组成面向对象的思想符合人类思维习惯,面向对象的思想描述面向对象的世界2.软件出现的目的n用计算机的语言描述现实世界n用计算机解决现实世界的问题3.面向对... 查看详情

面向对象程序设计具都有哪些特性呢?

...而产生的不同的派生类,其对象对同一消息会做出不同的响应。参考技术A1、封装性,封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改 查看详情

这是博客

...提高,计算机被用于解决越来越复杂的问题。一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。通过面向对象的方法,更利... 查看详情

设计模式精要

设计模式的最终目的是解决软件的高可维护性和高复用性问题以及应对大数据、高并发、高智能的挑战。设计模式遵循的原则:1开闭原则。对开展开放,对修改关闭。不修改原代码的前提下实施功能扩展。2里氏代换。子类可以... 查看详情

面向对象思想

...的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实... 查看详情

编程思想

...html4.分层将系统分解为多个层次,精确定义每层所提供的服务及层次之 查看详情

oop编程思想

OOP核心思想:封装,继承,多态。理解:对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式... 查看详情

类与正则相关(代码片段)

...定的功能,从设计的角度来看,封装还提供了一个重要的服务,它分开了是什么和怎么做这两个问题。对象的实现与使用是相互独立的,封装的另外一个优势是支持代码复用,它可以将常用功能以组件方式打包起来。2》多态多... 查看详情

28道java基础面试题-上

...行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系 查看详情

ued团队规范设计参考及建议

...很多类似的页面以及组件,可以通过抽象得到一些稳定且高复用性的内容。通过模块化的解决方案,降低冗余的生产成本。而标准化规范是达到此目的起点。在任何行业中一套良好的工作流程不仅可以保证各个阶段输出物的质量... 查看详情

面向对象抽象封装

...类都可以访问protected(受保护的)【继承中讲解】? 面向对象设计的步骤? 发现类(名词)? 发现属性(名词或形容词)? 发现方法(动词)? 类和对象的概 查看详情

面向对象抽象封装

...类都可以访问protected(受保护的)【继承中讲解】? 面向对象设计的步骤? 发现类(名词)? 发现属性(名词或形容词)? 发现方法(动词)? 类和对象的概念 查看详情

软件架构思想系列模块化与抽象

...,模块化能专注一点,提高效率。现在编程基本都是面向对象编程,面向对象的三大特性:封装、继承和多态。这里再说一个概念:"类"。简单的说,对象就是是程序中生成的实体,比如"鸡蛋","橘子"等,类就是对对象的描述,描... 查看详情

23种设计模式之设计模式简介

...计模式这几天在看GoF的《设计模式——可复用面向对象软件的基础》,发现晦涩难懂,在网上搜索视频教程,搭配学习。李建忠老师讲的”设计模式“教程,循序渐进,非常棒。写下笔记,吸收更快什么是设计模式... 查看详情

软件设计师11-面向对象技术

...工厂方法就可以帮你创建出来。抽象工厂可以按系列生产响应的对象。结构型模式:类或对象的组合,让类或对象形成更大的结构。行为型模式:类或对象的交互以及职责的分配。创建型模式结构型模式行为型模式责任链模式:... 查看详情

面向对象的四大特征封装继承多态抽象

1.封装 广义:类方法包的定义本身就是一种封装 狭义:在设计一个类的时候 将所有的属性设置为私有的 并对各个私有的属性设计相应的存/取方法来完成对属性的使用 私有化只能代表封装的特性 可以说私有是封装的一种不能说封... 查看详情

设计模式--迭代模式

...当中来实现具体应用,在设计模式中强调的是"低耦合","高复用","不要用具体代码来编程,要优先使用接口和抽象类来编程。"    这个实例当中不管BookShelf如何变化,只要BookShelf类可以返回重写了Iterator方法(hasNext,Next)的Bo... 查看详情

35面向对象设计模式之抽象工厂(abstractfactory)设计模式(代码片段)

...问题:  常规的对一个象创建方法:  //创建一个Road对象  Roadroad=newRoad();new的问题:  -实现依赖,不能应对“具体实例化类型”的变化。解决思路:  -封装变化点——哪里变化,封装哪里  -潜台词:... 查看详情