偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

小設(shè)計(jì),大作用——談?wù)劮栏瘜拥拿钣?/h1>

開(kāi)發(fā) 前端
大多數(shù)應(yīng)用程序依賴(lài)于其他系統(tǒng)的某些數(shù)據(jù)或功能。例如,舊版應(yīng)用程序遷移到新式系統(tǒng)時(shí),可能仍需要現(xiàn)有的舊的資源。

前言

最近在看領(lǐng)域驅(qū)動(dòng)模型DDD相關(guān)的東西,由于沒(méi)有實(shí)際的項(xiàng)目支撐,所以大都是停留在一些理論層面。但是我發(fā)現(xiàn)這里面的一些設(shè)計(jì)思想還是非常有實(shí)用價(jià)值的,可以直接應(yīng)用于你目前的項(xiàng)目中,今天我就來(lái)談?wù)劮栏瘜拥拿钣谩?/p>

一個(gè)簡(jiǎn)單的例子

大家在做項(xiàng)目中是否有過(guò)這樣的經(jīng)歷,你的項(xiàng)目中需要調(diào)用一個(gè)外部服務(wù)接口,而這個(gè)外部服務(wù)接口需要在你的項(xiàng)目中的不同地方被多次使用,比如在公司項(xiàng)目中就出現(xiàn)調(diào)用下面獲取用戶(hù)詳細(xì)信息的外部的接口多達(dá)10幾次。

SessionUser getUserDetail(String username)SessionUser getUserDetail(String username)

一旦這個(gè)外部接口發(fā)生變化,那么是不是意味著我就要修改這幾十處的地方,簡(jiǎn)直頭大。

那我們是不是可以對(duì)外部接口做一層適配封裝,隔離這種可能地、不可控的變化。因此在我們的manager層中添加了一個(gè)UserManager的類(lèi),如下所示:

@Component
public class UserManager() {

    @Autowired
    private UserApi remoteUserApi;

    public UserDTO getUserDetail(String username) {
  SessionUser sessionUser = remoteUserApi.getUserDetail(username);
        UserDTO user = convertUser(sessionUser);
        return user;
    }
}@Component
public class UserManager() {

    @Autowired
    private UserApi remoteUserApi;

    public UserDTO getUserDetail(String username) {
  SessionUser sessionUser = remoteUserApi.getUserDetail(username);
        UserDTO user = convertUser(sessionUser);
        return user;
    }
}

我們讓系統(tǒng)中的業(yè)務(wù)層從原來(lái)直接調(diào)用remoteUserApi.getUserDetail(String username)改為調(diào)用UserManager#getUserDetail(),這樣哪怕有一天外部接口的返回內(nèi)容、方法名發(fā)生變化,我們也只需要修改一下這一個(gè)地方,而無(wú)需修改上層調(diào)用的十幾處地方。

另外,我們還可以再這一層加入更多的功能,比如參數(shù)校驗(yàn),日志打印等等,如下代碼所示:

@Component
public class UserManager() {

    @Autowired
    private UserApi remoteUserApi;

    public List<UserDTO> getUserDetail(String username) {
        // 參數(shù)校驗(yàn)
        if(StrUtils.isBlank(username)) {
            throw new UserException("用戶(hù)名不能為空");
        }
        long t1 = System.currentTimeMillis();
  SessionUser sessionUser = remoteUserApi.getUserDetail(username);
        long t2 = System.currentTimeMillis();
        // 打印日志,方便甩鍋    
        if(t2 - t1 > 3000L) {
            log.warn("調(diào)用外部接口耗時(shí)過(guò)長(zhǎng),cost:[{}]ms", t2 - t1);
        }
        UserDTO user = convertUser(sessionUser);
        return user;
    }
}@Component
public class UserManager() {

    @Autowired
    private UserApi remoteUserApi;

    public List<UserDTO> getUserDetail(String username) {
        // 參數(shù)校驗(yàn)
        if(StrUtils.isBlank(username)) {
            throw new UserException("用戶(hù)名不能為空");
        }
        long t1 = System.currentTimeMillis();
  SessionUser sessionUser = remoteUserApi.getUserDetail(username);
        long t2 = System.currentTimeMillis();
        // 打印日志,方便甩鍋    
        if(t2 - t1 > 3000L) {
            log.warn("調(diào)用外部接口耗時(shí)過(guò)長(zhǎng),cost:[{}]ms", t2 - t1);
        }
        UserDTO user = convertUser(sessionUser);
        return user;
    }
}

我們可以加上額外的參數(shù)驗(yàn)證,打印調(diào)用外部接口的耗時(shí),有理由“甩鍋”。

防腐層介紹

通過(guò)上面一個(gè)簡(jiǎn)單的例子,你是不是對(duì)防腐層有了一個(gè)初步的認(rèn)識(shí)。通俗的說(shuō),我們認(rèn)為外部系統(tǒng)、接口中間件等都是腐爛的,不可控的,我們需要添加一層去做隔離和防腐,被叫做防腐層。

大多數(shù)應(yīng)用程序依賴(lài)于其他系統(tǒng)的某些數(shù)據(jù)或功能。例如,舊版應(yīng)用程序遷移到新式系統(tǒng)時(shí),可能仍需要現(xiàn)有的舊的資源。新功能必須能夠調(diào)用舊系統(tǒng)。逐步遷移尤其如此,隨著時(shí)間推移,較大型應(yīng)用程序的不同功能遷移到新式系統(tǒng)中。

這些舊系統(tǒng)通常會(huì)出現(xiàn)質(zhì)量問(wèn)題,如復(fù)雜的數(shù)據(jù)架構(gòu)或過(guò)時(shí)的 API。舊系統(tǒng)使用的功能和技術(shù)可能與新式系統(tǒng)中的功能和技術(shù)有很大差異。若要與舊系統(tǒng)進(jìn)行互操作,新應(yīng)用程序可能需要支持過(guò)時(shí)的基礎(chǔ)結(jié)構(gòu)、協(xié)議、數(shù)據(jù)模型、API、或其他不會(huì)引入新式應(yīng)用程序的功能。不僅僅是舊系統(tǒng),不受開(kāi)發(fā)團(tuán)隊(duì)控制的任何外部系統(tǒng)(第三方系統(tǒng))都可能出現(xiàn)類(lèi)似的問(wèn)題,因此引入防腐層去做隔離解決。

圖片圖片

如上圖所示,子系統(tǒng) A 通過(guò)防腐層調(diào)用子系統(tǒng) B。子系統(tǒng) A 與防腐層之間的通信始終使用子系統(tǒng) A 的數(shù)據(jù)模型和體系結(jié)構(gòu)。防腐層向子系統(tǒng) B 發(fā)出的調(diào)用符合該B子系統(tǒng)的數(shù)據(jù)模型或方法。防腐層包含在兩個(gè)系統(tǒng)之間轉(zhuǎn)換所必需的所有邏輯。該層可作為應(yīng)用程序內(nèi)的組件或作為獨(dú)立服務(wù)實(shí)現(xiàn)。

總結(jié)

說(shuō)了那么多,這是不是和設(shè)計(jì)模式中的適配器模式很像,實(shí)際上防腐層也叫適配層。當(dāng)然寫(xiě)防腐層也是有代價(jià)的。最大的代價(jià)就是有「額外的開(kāi)發(fā)成本」。所以如果你的上下游比較少,且比較穩(wěn)定,其實(shí)是可以不用防腐層的。但是在大型團(tuán)隊(duì),付出這些額外的開(kāi)發(fā)成本是有價(jià)值的,因?yàn)榇笮蛨F(tuán)隊(duì)的上下游關(guān)系非常復(fù)雜,他們可能不是在一個(gè)團(tuán)隊(duì),也有可能經(jīng)常進(jìn)行迭代升級(jí),通過(guò)我自己的經(jīng)驗(yàn)來(lái)看,接口變化是經(jīng)常會(huì)發(fā)生的。

責(zé)任編輯:武曉燕 來(lái)源: JAVA旭陽(yáng)
相關(guān)推薦

2020-12-17 06:44:00

防腐層驅(qū)動(dòng)

2011-10-13 15:46:48

通知中心手機(jī)

2020-10-20 17:03:19

戴爾

2011-04-26 16:25:42

掃描儀應(yīng)用維護(hù)

2012-07-16 10:19:02

MongoDB

2022-06-07 08:31:44

JavaUnsafe類(lèi)

2023-12-25 12:57:00

樹(shù)形結(jié)構(gòu)CSScounters

2011-04-29 13:55:31

一體機(jī)

2023-01-05 11:27:27

技術(shù)架構(gòu)

2023-09-14 12:46:00

模型數(shù)據(jù)

2021-11-21 22:33:14

微信功能技巧

2015-09-28 16:35:06

數(shù)據(jù)中心光模塊

2013-02-22 15:09:20

8路服務(wù)器TS850

2016-09-09 12:51:23

PhxSQL原則局限性

2014-01-16 09:22:56

Chrome圖標(biāo)

2021-02-25 23:57:09

數(shù)據(jù)分析大數(shù)據(jù)技術(shù)

2023-12-05 16:01:12

模板方法設(shè)計(jì)模式算法結(jié)構(gòu)

2020-10-16 16:16:39

MAXHUB

2010-09-29 15:17:22

J2MEDisplay類(lèi)

2011-07-18 09:19:33

Redis
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)