成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文徹底搞明白外觀模式

開發(fā) 前端
對于一個系統(tǒng)來講,對外暴露清晰簡潔的接口是非常有必要的。這不僅可以節(jié)省與調(diào)用方的溝通成本,也可以與調(diào)用方相對解耦,以便后續(xù)獨(dú)立進(jìn)行演進(jìn)。

本篇講解Java設(shè)計(jì)模式中的外觀模式,分為定義、模式應(yīng)用前案例、結(jié)構(gòu)、模式應(yīng)用后案例、適用場景、模式可能存在的困惑和本質(zhì)探討7個部分。

定義

外觀模式是為子系統(tǒng)中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。

在新的分類方式中,外觀模式被劃分至類之間的交互類別中,其簡化的是一個類與一組類之間的交互耦合問題。

模式應(yīng)用前案例

在外觀模式中,列舉一個電商領(lǐng)域的案例。先來看一下未使用外觀模式前的代碼實(shí)現(xiàn)。

電商領(lǐng)域通常包括庫存子系統(tǒng)、支付子系統(tǒng)和物流子系統(tǒng),代碼如下。

public class InventorySystem {//庫存子系統(tǒng)


    public void updateInventory(String product, int quantity) {
        System.out.println("Updating inventory for " + product + ": " + quantity);
    }

}

public class PaymentSystem {//支付子系統(tǒng)

    public void processPayment(double amount) {
        System.out.println("Processing payment: $" + amount);
    }

}

public class ShippingSystem {//物流子系統(tǒng)

    public void shipOrder(String address) {
        System.out.println("Shipping order to address: " + address);
    }

}

調(diào)用方代碼如下。

public class Client {//調(diào)用方代碼

    public static void main(String[] args) {

        InventorySystem inventory = new InventorySystem();
        PaymentSystem payment = new PaymentSystem();
        ShippingSystem shipping = new ShippingSystem();


        inventory.updateInventory("Computer", 1);
        payment.processPayment(1500);
        shipping.shipOrder("123 Main Street");

    }

}

在上述代碼中,不難發(fā)現(xiàn),調(diào)用方與各個子系統(tǒng)直接耦合,這樣主要帶來兩個問題。

一個問題是調(diào)用方需要知曉每一個子系統(tǒng)的細(xì)節(jié)。在某些情況下,這些子系統(tǒng)之間的關(guān)系也需要知曉。

另一個問題是如果子系統(tǒng)代碼發(fā)生變更,調(diào)用方代碼也需要受到關(guān)聯(lián)影響。

結(jié)構(gòu)

外觀模式的示例代碼如下。

public class SubSystemOne {
    public void MethodOne() {
        System.out.println("Called SubSystemComponentOne's methodOne()");
    }
}

public class SubSystemTwo {
    public void MethodTwo() {
        System.out.println("Called SubSystemComponentTwo's MethodTwo()");
    }
}

public class SubSystemThree {
    public void MethodThree() {
        System.out.println("Called SubSystemComponentThree's methodThree()");
    }
}

public class SubSystemFour {
    public void MethodFour() {
        System.out.println("Called SubSystemComponentFour's MethodFour()");
    }
}

public class Facade {

    private SubSystemOne componentOne;
    private SubSystemTwo componentTwo;
    private SubSystemThree componentThree;
    private SubSystemFour componentFour;

    public Facade() {
        componentOne = new SubSystemOne();
        componentTwo = new SubSystemTwo();
        componentThree = new SubSystemThree();
        componentFour = new SubSystemFour();
    }

    public void MethodA() {
        componentOne.MethodOne();
        componentTwo.MethodTwo();
        componentThree.MethodThree();
    }

    public void MethodB() {
        componentTwo.MethodTwo();
        componentThree.MethodThree();
        componentFour.MethodFour();
    }
}

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();

        // 客戶端只需要調(diào)用外觀類提供的接口
        facade.MethodA();
        facade.MethodB();
    }
}

模式應(yīng)用后案例

上述電商領(lǐng)域的案例,在應(yīng)用外觀模式之后的代碼實(shí)現(xiàn)如下。

庫存子系統(tǒng)、支付子系統(tǒng)和物流子系統(tǒng)的代碼不變。

public class InventorySystem {//庫存子系統(tǒng)

    public void updateInventory(String product, int quantity) {
        System.out.println("Updating inventory for " + product + ": " + quantity);
    }

}

public class PaymentSystem {//支付子系統(tǒng)

    public void processPayment(double amount) {
        System.out.println("Processing payment: $" + amount);
    }

}

public class ShippingSystem {//物流子系統(tǒng)

    public void shipOrder(String address) {
        System.out.println("Shipping order to address: " + address);
    }

}

按照外觀模式,增加了一個外觀類。

public class OrderFacade {//訂單外觀類

    private final InventorySystem inventory;
    private final PaymentSystem payment;
    private final ShippingSystem shipping;

    public OrderFacade() {
        this.inventory = new InventorySystem();
        this.payment= new PaymentSystem();
        this.shipping= new ShippingSystem();
    }

    //提供一個簡化方法來處理整個訂單流程
    public void placeOrder(String product, int quantity,double amount,String address){
        this.inventory.updateInventory(product,quantity);
        this.payment.processPayment(amount);
        this.shipping.shipOrder(address);
    }
}

最后,調(diào)用方代碼修改如下。

public class Client {

    public static void main(String[] args) {
        //使用外觀模式進(jìn)行下單操作
        OrderFacade facade= new OrderFacade();
        facade.placeOrder("Computer", 1, 1500.00,"123 Main Street");
    }
}

可以看到,代碼的復(fù)雜性已經(jīng)挪到外觀類中實(shí)現(xiàn),調(diào)用方代碼變得非常簡潔清晰。

適用場景

外觀模式適用于以下場景:

1、多個子系統(tǒng)或接口需要通過一定的交互共同為調(diào)用方服務(wù),如果希望子系統(tǒng)后續(xù)可以相對調(diào)用方獨(dú)立進(jìn)行演進(jìn),可以考慮外觀模式

2、需求實(shí)現(xiàn)新功能時,需要依賴企業(yè)中的遺留系統(tǒng)的功能。由于遺留系統(tǒng)通常后續(xù)會安排下線。此時就不建議將遺留系統(tǒng)的接口直接對調(diào)用方暴露,而是在一個外觀類中封裝新增加的功能和遺留系統(tǒng)功能

模式可能存在的困惑

困惑1:外觀模式定義中提到的“界面”,具體是什么含義?

在外觀模式中,多個子系統(tǒng)屬于一個大的系統(tǒng)。界面可以理解為這個大系統(tǒng)對外暴露的契約接口。調(diào)用方只能通過界面來與系統(tǒng)進(jìn)行交互。

本質(zhì)

對于一個系統(tǒng)來講,對外暴露清晰簡潔的接口是非常有必要的。這不僅可以節(jié)省與調(diào)用方的溝通成本,也可以與調(diào)用方相對解耦,以便后續(xù)獨(dú)立進(jìn)行演進(jìn)。

在系統(tǒng)建設(shè)初期,和調(diào)用方會制定契約接口。但是隨著系統(tǒng)功能越來越多,經(jīng)常會發(fā)現(xiàn)調(diào)用方需要依賴的接口越來越多,此時就可以將相互有關(guān)系的接口,再通過外觀類這一層進(jìn)行再封裝,始終保持對外的簡潔性。

此外,在外觀模式下,外觀類通常并不新增功能,僅僅是封裝已有多個子系統(tǒng)的交互關(guān)系。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2024-05-13 10:45:25

中介模式面向?qū)ο?/a>數(shù)量

2024-05-09 09:09:19

組合模式對象

2024-05-11 14:18:44

迭代器模式業(yè)務(wù)

2024-05-17 10:08:59

享元模式分類方式

2024-05-15 17:41:37

備忘錄模式多線程

2019-08-27 14:46:59

ElasticSearES數(shù)據(jù)庫

2020-07-10 08:03:35

DNS網(wǎng)絡(luò)ARPAne

2023-05-29 08:45:45

Java注解數(shù)據(jù)形式

2019-09-09 11:02:17

Nginx進(jìn)程模型

2023-03-13 08:12:37

Golang編程路徑問題

2021-05-06 08:03:07

IPIP網(wǎng)絡(luò)模式calicok8s

2023-11-06 09:06:54

分布式一致性數(shù)據(jù)

2022-05-30 10:37:35

分布式事務(wù)反向補(bǔ)償

2020-12-07 06:19:50

監(jiān)控前端用戶

2021-07-08 10:08:03

DvaJS前端Dva

2021-06-30 08:45:02

內(nèi)存管理面試

2023-10-27 08:15:45

2022-06-07 10:13:22

前端沙箱對象

2020-03-18 14:00:47

MySQL分區(qū)數(shù)據(jù)庫

2019-10-28 10:19:27

JVM 類加載器Java
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 免费观看国产视频在线 | 91精品国产91久久久久久最新 | 午夜视频在线免费观看 | 亚洲一区二区在线播放 | 国产精品久久久久久影视 | 国产视频91在线 | 日韩精品一区二区不卡 | 久久国产精品首页 | 亚洲一区二区在线免费观看 | 日韩第一夜 | 综合激情网 | 亚洲欧美日韩一区 | 日韩一区二区三区在线观看 | 久久精品国产一区二区三区不卡 | 精品国产91 | 日韩精品无码一区二区三区 | 91国内产香蕉 | 国产一区二区精品在线观看 | 欧美三区视频 | 超碰人人在线 | 精品国产一区二区三区四区在线 | 91久色| 精品国产一区二区久久 | 99久久精品免费视频 | 日日夜夜免费精品 | 午夜网| 亚洲第一网站 | 午夜爽爽爽男女免费观看影院 | 亚州精品天堂中文字幕 | 欧美日韩美女 | 欧美日韩一区二区在线 | 中文字幕一区二区三区日韩精品 | 久热久| 国产精品欧美一区二区三区不卡 | 亚洲一区二区免费电影 | 亚洲一区二区在线视频 | 日本精品免费在线观看 | 久草热线 | 99久久精品免费视频 | 国产区精品视频 | 五月天国产|