成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設計模式之門面模式

Chiclaim / 2254人閱讀

摘要:定義與類型定義又叫門面模式,提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口外觀模式定義了一個高層接口,讓子系統(tǒng)更容易使用類型結構型類圖門面模式是對系統(tǒng)復雜的關系處理做了一個封裝,對外提供一個簡單的接口,成員介紹子系統(tǒng)被門面模式封裝的子系統(tǒng)

0x01.定義與類型

定義:又叫門面模式,提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口

外觀模式定義了一個高層接口,讓子系統(tǒng)更容易使用

類型:結構型

UML類圖

門面模式是對系統(tǒng)復雜的關系處理做了一個封裝,對外提供一個簡單的接口,成員介紹:

子系統(tǒng):被門面模式封裝的子系統(tǒng),也是具體業(yè)務邏輯的細節(jié)

facade類:門面類,對子系統(tǒng)執(zhí)行流程進行封裝,對外開放功能接口,一般為單例對象。

0x02.適用場景

子系統(tǒng)越來越復雜,增加外觀模式提供簡單調(diào)用接口

構建多層系統(tǒng)結構,利用外觀對象作為每層的入口,簡化層間調(diào)用

0x03.優(yōu)點

簡化了調(diào)用過程,無需了解深入子系統(tǒng),防止帶來風險

減少系統(tǒng)依賴、松散耦合

更好的劃分訪問層次

符合迪米特法則,即最少知道原則

0x04.缺點

增加子系統(tǒng),需要修改門面類,容易引入風險。

修改門面類,不符合開閉原則

0x05.樣例代碼
場景:假設積分兌換物品流程,一共有三部分別依賴三個子系統(tǒng)
1.積分校驗系統(tǒng),查看是否有資格。
2.積分支付系統(tǒng),兌換禮物,扣減積分等。
3.物流系統(tǒng),兌換禮物后,進行配送流程。

如果不適用門面模式,需要在客戶端進行三個步驟的調(diào)用,而門面封裝后只需要使用門面類,下面具體代碼實現(xiàn):

/**
 * 禮物實體類
 */
public class PointsGift {

    private String name;

    public PointsGift(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/**
 * 支付子系統(tǒng)
 */
public class PointsPaymentService {
    public boolean pay(PointsGift pointsGift) {
        //扣減積分
        System.out.println("支付:" + pointsGift.getName() + " 積分成功!");
        return true;
    }
}

/**
 * 積分校驗子系統(tǒng)
 */
public class QualifyService {

    public boolean isAvailable (PointsGift pointsGift) {
        System.out.println("校驗" + pointsGift.getName() + "積分資格通過,庫存通過");
        return true;
    }
}

/**
 * 物流子系統(tǒng)
 */
public class ShippingService {
    public String shipGift (PointsGift pointsGift) {
        //物流系統(tǒng)的對接邏輯
        System.out.println(pointsGift.getName() + "進入物流系統(tǒng)");
        return "666";
    }
}

/**
 * 扣減積分門面類
 */
public class GiftExchangeService {

    /**
     * 模擬注入
     */
    private QualifyService qualifyService = new QualifyService();
    private PointsPaymentService pointsPaymentService = new PointsPaymentService();
    private ShippingService shippingService = new ShippingService();

    //模擬注入,一開始就已經(jīng)有了三個依賴的子系統(tǒng)
//    public void setQualifyService(QualifyService qualifyService) {
//        this.qualifyService = qualifyService;
//    }
//
//    public void setPointsPaymentService(PointsPaymentService pointsPaymentService) {
//        this.pointsPaymentService = pointsPaymentService;
//    }
//
//    public void setShippingService(ShippingService shippingService) {
//        this.shippingService = shippingService;
//    }

    public void giftExchange (PointsGift pointsGift) {
        if (qualifyService.isAvailable(pointsGift)) {
            //資格校驗通過
            if (pointsPaymentService.pay(pointsGift)) {
                //如果支付積分成功
                String shippingOrderNo = shippingService.shipGift(pointsGift);
                System.out.println("物流訂單號:" + shippingOrderNo);
            }
        }
    }
}

測試與調(diào)用類

/**
 * 客戶端與測試類
 */
public class Test {

    public static void main(String[] args) {
        PointsGift pointsGift = new PointsGift("連衣裙");
        GiftExchangeService giftExchangeService = new GiftExchangeService();

//        giftExchangeService.setQualifyService(new QualifyService());
//        giftExchangeService.setPointsPaymentService(new PointsPaymentService());
//        giftExchangeService.setShippingService(new ShippingService());

        giftExchangeService.giftExchange(pointsGift);
    }
}

測試輸出結果:

校驗連衣裙積分資格通過,庫存通過
支付:連衣裙 積分成功!
連衣裙進入物流系統(tǒng)
物流訂單號:666

樣例UML

0x06.相關的設計模式

外觀模式和中介者模式

外觀模式關注的是外界和子系統(tǒng)直接的交互

中介者模式關注的是子系統(tǒng)之間的交互

外觀模式和單例模式

外觀模式中外觀對象可以做成單例對象來使用

外觀模式和抽象工廠模式

外觀類可以通過抽象工廠獲取子系統(tǒng)實例

子系統(tǒng)可以在內(nèi)部對外觀類進行屏蔽

0x07.源碼中的外觀模式

SpringJDBC中的:JdbcUtils是對JDBC的封裝

MyBatis: Configuration中new開頭的方法

Tomcat: RequestFacade類

Tomcat: Request類

Tomcat: ResponseFacade類

Tomcat: StandardSessionFacade類

0x08.代碼地址

門面模式: https://github.com/sigmako/design-pattern/tree/master/facade

0x09.參考

慕課網(wǎng)設計模式精講: https://coding.imooc.com/class/270.html

門面模式: https://www.cnblogs.com/skywang/articles/1375447.html

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75321.html

相關文章

  • Java設計模式(九)——門面模式

    摘要:門面模式提供一個高層次的接口,使得子系統(tǒng)更易于使用。適配器模式和門面模式區(qū)別適配器模式和門面模式區(qū)別適配器模式主要做接口轉(zhuǎn)換,解決的是原接口和目標接口不匹配的問題。1、什么是門面模式?Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface...

    不知名網(wǎng)友 評論0 收藏0
  • 設計模式結構型

    摘要:適配器模式不應在設計階段考慮,它是為了解決已經(jīng)上線的問題的存在。組合模式將對象組合成樹形結構以表示部分整體的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。 代理模式 代理模式之前已經(jīng)講過,附上鏈接代理模式 裝飾者模式 裝飾者模式定義:動態(tài)地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活。 裝飾模式博主在第一次學習是懵逼的,是因為代理模式中代理對象和...

    Muninn 評論0 收藏0
  • 聽飛狐聊JavaScript設計模式系列08

    摘要:本回內(nèi)容介紹上一回聊到工廠模式,略抽象。官方說法,門面模式是指提供一個統(tǒng)一的接口去訪問多個子系統(tǒng)的多個不同的接口,為子系統(tǒng)中的一組接口提供一個統(tǒng)一的高層接口。使得子系統(tǒng)更容易使用。 本回內(nèi)容介紹 上一回聊到工廠模式,略抽象。介一回,咱聊門面模式就比較容易了,門面模式也叫外觀模式(facade)。官方說法,門面模式是指提供一個統(tǒng)一的接口去訪問多個子系統(tǒng)的多個不同的接口,為子系統(tǒng)中的一組接...

    saucxs 評論0 收藏0
  • 【編程課堂】php設計模式(二):結構型模式(續(xù))

    摘要:能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,能夠在一定程度上降低系統(tǒng)的耦合性。特點低耦合性,獨立性好,安全性應用客戶訪問不到或者被訪問者希望隱藏自己,所以通過代理來訪問自己。 我們接著上面的幾種模式繼續(xù)講: 4、組合模式 將對象組合成樹形結構表示部分-整體的層次結構。 特點:靈活性強 應用:對象的部分-整體的層次結構,模糊組合對象和簡單對象處理問題 代碼實現(xiàn) /** 組合模式* *///繼承模式clas...

    Nekron 評論0 收藏0
  • JavaScript 設計模式讀書筆記(六)——門面模式

    摘要:簡單的門面模式實例事件綁定函數(shù)門面模式的作用是將復雜的接口進行包裝,變成一個便于使用的接口。還是以事件相關為例,事件綁定中還有兩個常用的分別是和。 門面模式是什么,與其我去用笨拙的語言去解釋,不如看下面這張圖,曾經(jīng)在網(wǎng)上很火的一張圖片,說的是一位兒子為他的爸媽設置的電腦桌面。 showImg(http://segmentfault.com/img/bVcgHm); 有了這些起好名字...

    pubdreamcc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<