设计模式-传输对象模式

Posted 技术趋势

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-传输对象模式相关的知识,希望对你有一定的参考价值。

上文(设计模式-服务定位器模式):


背景

当项目还小的时候,通过用户的请求,直接返回实体里面的内容,这个是很多新手直接使用的方法,通过实体返回到服务层,再返回到控制层再给用户都是通过实体,但是一但项目大了,数据隔离和安全性有要求了,那么这样做其实很危险并且很容易因为多了字段或少了字段引发各种问题,所以就需要通过各种传输对象来进行中转。

传输对象模式是什么?

传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。它没有任何的行为。服务器端的业务类通常从数据库读取数据,然后填充 POJO,并把它发送到客户端或按值传递它。对于客户端,传输对象是只读的。客户端可以创建自己的传输对象,并把它传递给服务器,以便一次性更新数据库中的数值。以下是这种设计模式的实体。
角色:
业务对象(Business Object):为传输对象填充数据的业务服务。
传输对象(Transfer Object):简单的 POJO,只有设置/获取属性的方法。
客户端(Client):客户端可以发送请求或者发送传输对象到业务对象。
优点:
数据隔离:通过VO和BO可以有效的进行数据隔离,提高一定的安全性;
缺点:
很明显这个不同层返回不同的实体会导致代码量和相关的传输对象增加,开发工作量也会增加,并且在某种程度导致系统的复杂性提升;

传输对象模式可以干嘛?

主要起来不同层级的传输对象安全隔离。

个人理解:

类似于水通过不同的渠道有不同的管道来接,有些用塑料、铁的、其他的...

传输对象模式类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

/** * @Auther: csh * @Date: 2020/7/5 16:01 * @Description:uesrVo */public class UserVo implements Serializable { private String consumerId; private String userName;
public String getConsumerId() { return consumerId; }
public void setConsumerId(String consumerId) { this.consumerId = consumerId; }
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
public UserVo(String consumerId, String userName) { this.consumerId = consumerId; this.userName = userName; }
@Override public String toString() { return "UserVo{" + "consumerId='" + consumerId + '\'' + ", userName='" + userName + '\'' + '}'; }}
/** * @Auther: csh * @Date: 2020/7/5 16:02 * @Description:用户bo */public class UserBo implements Serializable { List<UserVo> userVos;
public UserBo() { userVos = new ArrayList <UserVo>(); userVos.add(new UserVo("1","用户1")); userVos.add(new UserVo("2","用户2")); }
public void delete(UserVo userVo){ userVos.remove(userVo.getConsumerId()); System.out.println("删除的用户信息"+userVo.toString()); }
//获取所有用户 public List<UserVo> getUserVos(){ return userVos; }
public UserVo getUser(int index){ return userVos.get(index); }
public void updateUserInfo(Integer index,UserVo userVo){ userVos.get(index).setUserName(userVo.getUserName()); System.out.println("更新的用户是:"+userVo.toString()); }}
/** * @Auther: csh * @Date: 2020/7/5 16:15 * @Description: */public class Client { public static void main(String[] args) { UserBo userBo = new UserBo(); for (UserVo userVo : userBo.getUserVos()) { System.out.println(userVo.toString()); } //更新 UserVo user = userBo.getUser(0); System.out.println(user.toString()); user.setUserName("user2"); userBo.updateUserInfo(0,user); //重新打印 System.out.println(userBo.getUser(0).toString());
}}

结果

UserVo{consumerId='1', userName='用户1'}UserVo{consumerId='2', userName='用户2'}UserVo{consumerId='1', userName='用户1'}更新的用户是:UserVo{consumerId='1', userName='user2'}UserVo{consumerId='1', userName='user2'}

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES


最后

在企业中其实该模式主要体现是不同的层通过不同的实体来接口和返回数据,当然该方法一定程度提升了系统安全,但是真xx的,开发工作量真的最少提升50%以上,不同的层要不同的传输对象来返回....可以参考相关文章

https://blog.csdn.net/weixin_43254907/article/details/88685939?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159393995219195264544052%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159393995219195264544052&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v3~pc_rank_v2-1-88685939.first_rank_ecpm_v3_pc_rank_v2&utm_term=vo+ao+Ro

https://blog.csdn.net/qq_32097871/article/details/85099513?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

以上是关于设计模式-传输对象模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-传输对象模式

值对象模式和数据传输模式之间的区别

流式传输 protoBuf 消息的设计模式

Java传输对象模式

用于从 cloudkit 检索单列的代码模式/片段

dao设计模式中的数据传输对象