上文(設計模式-攔截過濾器模式):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%以上,不同的層要不同的傳輸對象來返回....可以參考相關文章