前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-传输对象模式

设计模式-传输对象模式

作者头像
逍遥壮士
发布2020-09-18 11:33:55
5660
发布2020-09-18 11:33:55
举报
文章被收录于专栏:技术趋势技术趋势

背景

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

传输对象模式是什么?

传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。它没有任何的行为。服务器端的业务类通常从数据库读取数据,然后填充 POJO,并把它发送到客户端或按值传递它。对于客户端,传输对象是只读的。客户端可以创建自己的传输对象,并把它传递给服务器,以便一次性更新数据库中的数值。以下是这种设计模式的实体。

角色:

业务对象(Business Object):为传输对象填充数据的业务服务。

传输对象(Transfer Object):简单的 POJO,只有设置/获取属性的方法。

客户端(Client):客户端可以发送请求或者发送传输对象到业务对象。

优点:

数据隔离:通过VO和BO可以有效的进行数据隔离,提高一定的安全性;

缺点:

很明显这个不同层返回不同的实体会导致代码量和相关的传输对象增加,开发工作量也会增加,并且在某种程度导致系统的复杂性提升;

传输对象模式可以干嘛?

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

个人理解:

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

传输对象模式类图

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

实现代码

代码语言:javascript
复制
/**
 * @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 + '\'' +
                '}';
    }
}
代码语言:javascript
复制
/**
 * @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());
    }
}
代码语言:javascript
复制
/**
 * @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());

    }
}

结果

代码语言:javascript
复制
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%以上,不同的层要不同的传输对象来返回....可以参考相关文章

参考1

参考2

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档