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

一文搞懂設(shè)計(jì)模式—門(mén)面模式

開(kāi)發(fā) 前端
通過(guò)使用門(mén)面模式,我們可以簡(jiǎn)化復(fù)雜系統(tǒng)的調(diào)用過(guò)程,提高代碼的可維護(hù)性和可讀性。門(mén)面模式將子系統(tǒng)進(jìn)行封裝,并提供一個(gè)簡(jiǎn)單的接口給客戶(hù)端,隱藏了子系統(tǒng)的復(fù)雜性,同時(shí)解耦了客戶(hù)端與子系統(tǒng)之間的依賴(lài)關(guān)系。

軟件開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到復(fù)雜系統(tǒng),其中包含多個(gè)子系統(tǒng)和接口。在這種情況下,為了簡(jiǎn)化客戶(hù)端的調(diào)用過(guò)程,提高代碼的可維護(hù)性和可讀性,我們可以使用門(mén)面模式。

門(mén)面模式(Facade Pattern)也叫做外觀模式,是一種結(jié)構(gòu)型設(shè)計(jì)模式。它提供一個(gè)統(tǒng)一的接口,封裝了一個(gè)或多個(gè)子系統(tǒng)的復(fù)雜功能,并向客戶(hù)端提供一個(gè)簡(jiǎn)單的調(diào)用方式。通過(guò)引入門(mén)面,客戶(hù)端無(wú)需直接與子系統(tǒng)交互,而只需要通過(guò)門(mén)面來(lái)與子系統(tǒng)進(jìn)行通信。

門(mén)面模式中包含以下角色:

  • 門(mén)面(Facade):門(mén)面角色是門(mén)面模式的核心,它封裝了系統(tǒng)內(nèi)部復(fù)雜子系統(tǒng)的接口,為客戶(hù)端提供一個(gè)簡(jiǎn)單的高層接口。門(mén)面角色知道哪些子系統(tǒng)負(fù)責(zé)處理請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)給相應(yīng)的子系統(tǒng)進(jìn)行處理。
  • 子系統(tǒng)(Subsystem):子系統(tǒng)角色是實(shí)際執(zhí)行系統(tǒng)功能的組件。每個(gè)子系統(tǒng)都有自己的職責(zé)和行為,通過(guò)門(mén)面角色對(duì)外提供服務(wù)。
  • 客戶(hù)端(Client):客戶(hù)端角色通過(guò)調(diào)用門(mén)面角色提供的高層接口來(lái)使用系統(tǒng)功能,而無(wú)需直接與子系統(tǒng)交互。

在門(mén)面模式中,門(mén)面角色充當(dāng)了客戶(hù)端和子系統(tǒng)之間的中介者,隱藏了子系統(tǒng)的復(fù)雜性,簡(jiǎn)化了客戶(hù)端的調(diào)用過(guò)程。客戶(hù)端只需要與門(mén)面角色進(jìn)行交互,而不需要了解和處理子系統(tǒng)的具體細(xì)節(jié)。

注意:門(mén)面對(duì)象只是提供一個(gè)訪問(wèn)子系統(tǒng)的一個(gè)路徑而已,它不應(yīng)該也不能參與具體的業(yè)務(wù)邏輯,否則就會(huì)產(chǎn)生一個(gè)倒依賴(lài)的問(wèn)題:子系統(tǒng)必須依賴(lài)門(mén)面才能被訪問(wèn),這是設(shè)計(jì)上一個(gè)嚴(yán)重錯(cuò)誤,不僅違反了單一職責(zé)原則,同時(shí)也破壞了系統(tǒng)的封裝性。

使用場(chǎng)景

門(mén)面模式適用于以下情況:

  • 當(dāng)一個(gè)系統(tǒng)有很多復(fù)雜的子系統(tǒng)時(shí),可以使用門(mén)面模式將其封裝起來(lái),隱藏內(nèi)部復(fù)雜性,簡(jiǎn)化客戶(hù)端的調(diào)用。
  • 當(dāng)需要將客戶(hù)端與復(fù)雜的子系統(tǒng)解耦,降低系統(tǒng)之間的依賴(lài)時(shí),可以使用門(mén)面模式。

以下是一個(gè)簡(jiǎn)單的示例,展示了門(mén)面模式在電子商務(wù)系統(tǒng)中的應(yīng)用。

假設(shè)我們的電子商務(wù)系統(tǒng)包含了訂單管理、庫(kù)存管理和支付管理等子系統(tǒng)。為了簡(jiǎn)化客戶(hù)端的調(diào)用過(guò)程,我們可以使用門(mén)面模式來(lái)封裝這些子系統(tǒng),并提供一個(gè)統(tǒng)一的接口。

// 訂單管理子系統(tǒng)
class OrderService {
    public void createOrder() {
        // 創(chuàng)建訂單的具體實(shí)現(xiàn)
    }
}

// 庫(kù)存管理子系統(tǒng)
class InventoryService {
    public void checkStock() {
        // 檢查庫(kù)存的具體實(shí)現(xiàn)
    }
}

// 支付管理子系統(tǒng)
class PaymentService {
    public void makePayment() {
        // 支付的具體實(shí)現(xiàn)
    }
}

// 電子商務(wù)門(mén)面類(lèi)
class ECommerceFacade {
    private OrderService orderService;
    private InventoryService inventoryService;
    private PaymentService paymentService;

    public ECommerceFacade() {
        orderService = new OrderService();
        inventoryService = new InventoryService();
        paymentService = new PaymentService();
    }

    // 提供給客戶(hù)端的接口
    public void placeOrder() {
        orderService.createOrder();
        inventoryService.checkStock();
        paymentService.makePayment();
    }
}

在上述示例中,我們創(chuàng)建了一個(gè)電子商務(wù)門(mén)面類(lèi)(ECommerceFacade),它封裝了訂單管理、庫(kù)存管理和支付管理等子系統(tǒng),并提供了一個(gè)簡(jiǎn)單的接口(placeOrder)供客戶(hù)端調(diào)用。這樣,客戶(hù)端只需要通過(guò)門(mén)面類(lèi)來(lái)完成下單操作,而無(wú)需直接與子系統(tǒng)交互。

門(mén)面模式實(shí)現(xiàn)

下面是門(mén)面模式的基本結(jié)構(gòu):

// 子系統(tǒng)A
public class SubSystemA {
    public void operationA() {
        System.out.println("子系統(tǒng)A的操作");
    }
}

// 子系統(tǒng)B
public class SubSystemB {
    public void operationB() {
        System.out.println("子系統(tǒng)B的操作");
    }
}

// 子系統(tǒng)C
public class SubSystemC {
    public void operationC() {
        System.out.println("子系統(tǒng)C的操作");
    }
}

// 門(mén)面類(lèi)
public class Facade {
    private SubSystemA subSystemA;
    private SubSystemB subSystemB;
    private SubSystemC subSystemC;

    public Facade() {
        subSystemA = new SubSystemA();
        subSystemB = new SubSystemB();
        subSystemC = new SubSystemC();
    }

    // 提供簡(jiǎn)單的接口給客戶(hù)端調(diào)用,隱藏了子系統(tǒng)的復(fù)雜性
    public void operation() {
        subSystemA.operationA();
        subSystemB.operationB();
        subSystemC.operationC();
    }
}

在上述代碼中,我們有三個(gè)子系統(tǒng)(SubSystemA、SubSystemB、SubSystemC),它們分別實(shí)現(xiàn)了具體的功能。然后,我們創(chuàng)建了一個(gè)門(mén)面類(lèi)(Facade)來(lái)封裝這些子系統(tǒng),并提供了一個(gè)簡(jiǎn)單的接口供客戶(hù)端調(diào)用。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 簡(jiǎn)化客戶(hù)端的調(diào)用過(guò)程,隱藏了子系統(tǒng)的復(fù)雜性,提供了一個(gè)統(tǒng)一的接口,客戶(hù)端無(wú)需了解子系統(tǒng)的具體實(shí)現(xiàn)。
  • 減少系統(tǒng)的相互依賴(lài),解耦了客戶(hù)端與子系統(tǒng)之間的依賴(lài)關(guān)系。
  • 提高了代碼的可維護(hù)性和可讀性。

缺點(diǎn)

  • 門(mén)面模式可能會(huì)導(dǎo)致門(mén)面類(lèi)變得龐大,承擔(dān)過(guò)多的責(zé)任。
  • 如果需要修改子系統(tǒng)的功能,可能需要修改門(mén)面類(lèi)。

門(mén)面模式優(yōu)化

在實(shí)際應(yīng)用中,我們可以對(duì)門(mén)面模式進(jìn)行一些優(yōu)化和擴(kuò)展。以下是幾個(gè)常見(jiàn)的優(yōu)化實(shí)現(xiàn)方式:

子系統(tǒng)解耦

門(mén)面類(lèi)可以通過(guò)委托來(lái)調(diào)用子系統(tǒng)的功能,而不是直接依賴(lài)于具體的子系統(tǒng)。這樣可以使得子系統(tǒng)能夠獨(dú)立演化,不受門(mén)面類(lèi)的影響。

// 門(mén)面類(lèi)
class Facade {
    private SubSystemInterface subSystemA;
    private SubSystemInterface subSystemB;

    public Facade() {
        subSystemA = new ConcreteSubSystemA();
        subSystemB = new ConcreteSubSystemB();
    }

    // 提供給客戶(hù)端的接口
    public void operation() {
        subSystemA.operation();
        subSystemB.operation();
    }
}

// 子系統(tǒng)接口
interface SubSystemInterface {
    void operation();
}

// 具體的子系統(tǒng)A
class ConcreteSubSystemA implements SubSystemInterface {
    public void operation() {
        // 實(shí)現(xiàn)具體的功能
    }
}

// 具體的子系統(tǒng)B
class ConcreteSubSystemB implements SubSystemInterface {
    public void operation() {
        // 實(shí)現(xiàn)具體的功能
    }
}

多個(gè)門(mén)面類(lèi)

當(dāng)門(mén)面已經(jīng)龐大到不能忍受的程度,承擔(dān)過(guò)多的責(zé)任時(shí),可以考慮使用多個(gè)門(mén)面類(lèi),每個(gè)門(mén)面類(lèi)負(fù)責(zé)與特定的子系統(tǒng)交互,原則上建議按照功能拆分,比如一個(gè)數(shù)據(jù)庫(kù)操作的門(mén)面可以拆分為查詢(xún)門(mén)面、刪除門(mén)面、更新門(mén)面等。

// 子系統(tǒng)A的門(mén)面類(lèi)
class SubSystemAFacade {
    private SubSystemA subSystemA;

    public SubSystemAFacade() {
        subSystemA = new SubSystemA();
    }

    // 提供給客戶(hù)端的接口
    public void operation() {
        subSystemA.operationA();
    }
}

// 子系統(tǒng)B的門(mén)面類(lèi)
class SubSystemBFacade {
    private SubSystemB subSystemB;

    public SubSystemBFacade() {
        subSystemB = new SubSystemB();
    }

    // 提供給客戶(hù)端的接口
    public void operation() {
        subSystemB.operationB();
    }
}

通過(guò)上述優(yōu)化實(shí)現(xiàn)方式,我們能夠靈活地應(yīng)對(duì)不同的需求和場(chǎng)景,提高了系統(tǒng)的可擴(kuò)展性和維護(hù)性。

門(mén)面嵌套

假設(shè)我們有一個(gè)文件處理系統(tǒng),其中包括三個(gè)子系統(tǒng):文件讀取(FileReader)、文件寫(xiě)入(FileWriter)和文件壓縮(FileCompressor)。

現(xiàn)在有兩個(gè)模塊來(lái)訪問(wèn)該子系統(tǒng):通用模塊(GeneralModule)可以完整地訪問(wèn)所有業(yè)務(wù)邏輯,而受限模塊(RestrictedModule)只能訪問(wèn)文件讀取操作。

在這種情況下,我們可以在門(mén)面外再嵌套門(mén)面來(lái)解決接口權(quán)限問(wèn)題,以供不同的模塊訪問(wèn)。

// 子系統(tǒng):文件讀取
class FileReader {
    public void read(String filePath) {
        System.out.println("讀取文件:" + filePath);
        // 具體的讀取邏輯...
    }
}

// 子系統(tǒng):文件寫(xiě)入
class FileWriter {
    public void write(String filePath, String content) {
        System.out.println("寫(xiě)入文件:" + filePath);
        // 具體的寫(xiě)入邏輯...
    }
}

// 子系統(tǒng):文件壓縮
class FileCompressor {
    public void compress(String filePath, String destinationPath) {
        System.out.println("壓縮文件:" + filePath + " -> " + destinationPath);
        // 具體的壓縮邏輯...
    }
}

// 通用模塊門(mén)面
class GeneralFacade {
    private FileReader fileReader;
    private FileWriter fileWriter;
    private FileCompressor fileCompressor;

    public GeneralFacade() {
        this.fileReader = new FileReader();
        this.fileWriter = new FileWriter();
        this.fileCompressor = new FileCompressor();
    }

    public void processFile(String filePath, String content, String destinationPath) {
        fileReader.read(filePath);
        fileWriter.write(filePath, content);
        fileCompressor.compress(filePath, destinationPath);
    }
    
    public void read(String filePath) {
        fileReader.read(filePath);
    }
    
}

// 受限模塊門(mén)面
class RestrictedFacade {
    private GeneralFacade generalFacade = new GeneralFacade();
    
    public void readRestrictedFile(String filePath) {
        generalFacade.read(filePath);
    }
}

// 客戶(hù)端代碼
public class Client {
    public static void main(String[] args) {
        GeneralFacade generalFacade = new GeneralFacade();
        generalFacade.processFile("file.txt", "Hello World!", "compressed.zip");

        RestrictedFacade restrictedFacade = new RestrictedFacade();
        restrictedFacade.readRestrictedFile("file.txt");
    }
}

在上述示例中,我們使用了兩個(gè)不同的門(mén)面:GeneralFacade和RestrictedFacade。GeneralFacade提供了完整的訪問(wèn)子系統(tǒng)的方法(processFile),而RestrictedFacade僅提供了受限的文件讀取方法(readRestrictedFile)。

通過(guò)不同的門(mén)面對(duì)象,通用模塊可以訪問(wèn)所有子系統(tǒng)功能,而受限模塊只能訪問(wèn)特定的子系統(tǒng)功能。

總結(jié)

通過(guò)使用門(mén)面模式,我們可以簡(jiǎn)化復(fù)雜系統(tǒng)的調(diào)用過(guò)程,提高代碼的可維護(hù)性和可讀性。門(mén)面模式將子系統(tǒng)進(jìn)行封裝,并提供一個(gè)簡(jiǎn)單的接口給客戶(hù)端,隱藏了子系統(tǒng)的復(fù)雜性,同時(shí)解耦了客戶(hù)端與子系統(tǒng)之間的依賴(lài)關(guān)系。

責(zé)任編輯:武曉燕 來(lái)源: Java隨想錄
相關(guān)推薦

2024-02-26 11:52:38

代理模式設(shè)計(jì)

2024-01-29 12:22:07

設(shè)計(jì)模式策略模式

2023-05-22 13:27:17

2024-01-30 13:15:00

設(shè)計(jì)模式責(zé)任鏈

2024-02-21 12:24:33

模板設(shè)計(jì)模式框架

2024-02-23 12:11:53

裝飾器模式對(duì)象

2024-02-04 12:04:17

2024-02-27 11:59:12

享元模式對(duì)象

2024-02-18 12:36:09

2024-02-22 12:13:49

適配器模式代碼

2024-02-20 12:09:32

模式工廠方法接口

2022-05-05 16:47:24

Docker網(wǎng)絡(luò)空間容器

2022-09-21 16:56:16

設(shè)計(jì)模式微服務(wù)架構(gòu)

2021-03-18 15:33:22

設(shè)計(jì)模式外觀

2023-05-06 07:51:22

JavaFacade設(shè)計(jì)模式

2022-11-14 08:44:56

前端門(mén)面模式接口

2022-02-15 22:45:00

前端設(shè)計(jì)模式

2021-04-18 21:07:32

門(mén)面模式設(shè)計(jì)

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2024-04-12 12:19:08

語(yǔ)言模型AI
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 羞羞网站免费 | 日韩欧美精品一区 | 日本国产精品视频 | 中文字幕久久精品 | 欧美精品一区免费 | 免费三级网站 | 日韩一区二区三区在线观看视频 | 中文字幕国产高清 | av特级毛片 | 成人在线视频一区 | 1级黄色大片 | 久久成人一区二区三区 | 日日夜夜天天综合 | 国产精品久久久久久久 | 九九久久这里只有精品 | 羞视频在线观看 | 盗摄精品av一区二区三区 | 亚洲在线一区二区三区 | 亚洲精品乱码久久久久久按摩观 | 久久久久国产一区二区三区四区 | 91高清在线 | 成人在线免费视频观看 | 久久精品国产99国产精品亚洲 | 一级免费视频 | 成人福利视频网站 | 久久1区| 91影视 | 99久久精品免费 | 国产精品激情小视频 | 日韩中文字幕在线观看 | 国产在线一区二区 | 久久久久久久久久久久久久久久久久久久 | 最新日韩在线 | 国产成人免费视频 | 亚洲欧美精品 | 国产精品毛片久久久久久久 | 毛片在线免费 | 久久综合久色欧美综合狠狠 | 一区二区日韩精品 | 久久毛片 | 99久久久久国产精品免费 |