上文(设计模式-拦截过滤器模式):https://blog.csdn.net/qq_16498553/article/details/107141922
目录
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
背景
当项目还小的时候,通过用户的请求,直接返回实体里面的内容,这个是很多新手直接使用的方法,通过实体返回到服务层,再返回到控制层再给用户都是通过实体,但是一但项目大了,数据隔离和安全性有要求了,那么这样做其实很危险并且很容易因为多了字段或少了字段引发各种问题,所以就需要通过各种传输对象来进行中转。
传输对象模式是什么?
传输对象模式(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%以上,不同的层要不同的传输对象来返回....可以参考相关文章