【外觀設(shè)計模式詳解】C/Java/JS/Go/Python/TS不同語言實現(xiàn)
簡介
外觀模式(Facade Pattern),也叫門面模式,是一種結(jié)構(gòu)型設(shè)計模式。它向現(xiàn)有的系統(tǒng)添加一個高層接口,隱藏子系統(tǒng)的復(fù)雜性,這個接口使得子系統(tǒng)更加容易使用。
如果你需要一個指向復(fù)雜子系統(tǒng)的直接接口,且該接口的功能有限,則可以使用外觀模式?;蛘咝枰獙⒆酉到y(tǒng)組織為多層結(jié)構(gòu),可以使用外觀。
作用
- 讓業(yè)務(wù)代碼通過統(tǒng)一接口與內(nèi)部子系統(tǒng)隔離。
- 降低訪問內(nèi)部子系統(tǒng)時的復(fù)雜度,簡化客戶端之間的接口。
實現(xiàn)步驟
- 創(chuàng)建統(tǒng)一外觀接口和實現(xiàn)類,用于銜接調(diào)用方與子系統(tǒng)。
- 創(chuàng)建不同子模塊/子模塊,這些子模塊可以共同實現(xiàn)某通用接口,也可以各自獨立。
- 通過統(tǒng)一外觀接口來訪問這些復(fù)雜子類。
UML

facade-pattern.png
Java代碼
外觀基礎(chǔ)接口
// AbstractFacade.java 外觀模式的接口或抽象類,可選
public interface AbstractFacade {
public void encoding(int id);
public void encrypt(int id);
}
外觀模式實現(xiàn)類
// Facade.java 外觀模式實現(xiàn)類,是外部調(diào)用與內(nèi)部子系統(tǒng)的銜接層
public class Facade implements AbstractFacade {
private FileModule fileModule;
private NetworkModule networkModule;
private EncodeModule encodeModule;
public Facade() {
fileModule = new FileModule();
networkModule = new NetworkModule();
encodeModule = new EncodeModule();
}
public void encoding(int id) {
System.out.println(this.getClass().getName() + "::encoding() [id=" + id + "]");
networkModule.request();
fileModule.readFile();
encodeModule.encoding();
fileModule.saveFile();
}
public void encrypt(int id) {
System.out.println(this.getClass().getName() + "::encrypt() [id=" + id + "]");
fileModule.readFile();
encodeModule.encoding();
}
public FileModule getFileModule() {
return this.fileModule;
}
public NetworkModule getNetworkModule() {
return this.networkModule;
}
public EncodeModule getEncodeModule() {
return this.encodeModule;
}
}
幾個具體模塊類
// FileModule.java 文件模塊
public class FileModule {
public void readFile() {
System.out.println(this.getClass().getName() + "::readFile() 讀取文件。");
}
public void saveFile() {
System.out.println(this.getClass().getName() + "::saveFile() 保存文件。");
}
}
// EncodeModule.java 編碼模塊
public class EncodeModule {
public void encoding() {
System.out.println(this.getClass().getName() + "::encoding() 進(jìn)行編碼處理。");
}
}
// NetworkModule.java 網(wǎng)絡(luò)模塊
public class NetworkModule {
public void request() {
System.out.println(this.getClass().getName() + "::request() 遠(yuǎn)程讀取。");
}
}
測試調(diào)用
/**
* 外觀模式就是在外層添加一個訪問接口類,客戶通過這統(tǒng)一訪問接口來訪問這些復(fù)雜子類。
* 外觀模式與適配器模式比較像,都是提供一個高層訪問接口,隔絕外部客戶與內(nèi)部子類。
* 所不同是外觀模式后面的類無需實現(xiàn)相同接口,只是把各種調(diào)用整合簡化,而適配器需要是同一系列類,為的是解決接口不兼容。
* 這里聲明外觀類,外觀類的方法里影藏了很多子類的調(diào)用。
*/
AbstractFacade facade = new Facade();
facade.encoding(123456);
facade.encrypt(999999);
Python代碼
外觀基礎(chǔ)接口
# AbstractFacade.py 外觀模式的接口或抽象類,可選
# 外觀模式的接口或抽象類,可選
from abc import abstractmethod, ABCMeta
class AbstractFacade(metaclass=ABCMeta):
@abstractmethod
def encoding(self, id):
pass
@abstractmethod
def encrypt(id):
pass
外觀模式實現(xiàn)類
# Facade.py 外觀模式實現(xiàn)類,是外部調(diào)用與內(nèi)部子系統(tǒng)的銜接層
from src.AbstractFacade import AbstractFacade
from src.FileModule import FileModule
from src.NetworkModule import NetworkModule
from src.EncodeModule import EncodeModule
# 外觀模式實現(xiàn)類,是外部調(diào)用與內(nèi)部子系統(tǒng)的銜接層
class Facade():
# 繼承抽象類可選
# class Facade(AbstractFacade):
def __init__(self):
self.file_module = FileModule()
self.network_module = NetworkModule()
self.encode_module = EncodeModule()
def encoding(self, id):
print(self.__class__.__name__ + '::encoding() [id=' + str(id) + ']')
self.network_module.request()
self.file_module.read_file()
self.encode_module.encoding()
self.file_module.save_file()
def encrypt(self, id):
print(self.__class__.__name__ + '::encrypt() [id=' + str(id) + ']')
self.file_module.read_file()
self.encode_module.encoding()
def getfile_module(self):
return self.file_module
def getnetwork_module(self):
return self.network_module
def getencode_module(self):
return self.encode_module
幾個具體模塊類
# FileModule.py 文件模塊
class FileModule:
def read_file(self):
print(self.__class__.__name__ + '::read_file() 讀取文件。')
def save_file(self):
print(self.__class__.__name__ + '::save_file() 保存文件。')
# EncodeModule.py 編碼模塊
class EncodeModule():
def encoding(self):
print(self.__class__.__name__ + '::encoding() 進(jìn)行編碼處理。')
# NetworkModule.py 網(wǎng)絡(luò)模塊
class NetworkModule:
def request(self):
print(self.__class__.__name__ + '::request() 遠(yuǎn)程讀取。')
測試調(diào)用
import sys
import os
os_path = os.getcwd()
sys.path.append(os_path)
from src.Facade import Facade
def test():
'''
* 外觀模式就是在外層添加一個訪問接口類,客戶通過這統(tǒng)一訪問接口來訪問這些復(fù)雜子類。
* 外觀模式與適配器模式比較像,都是提供一個高層訪問接口,隔絕外部客戶與內(nèi)部子類。
* 所不同是外觀模式后面的類無需實現(xiàn)相同接口,只是把各種調(diào)用整合簡化,而適配器需要是同一系列類,為的是解決接口不兼容。
* 這里聲明外觀類,外觀類的方法里影藏了很多子類的調(diào)用。
'''
facade = Facade()
facade.encoding(123456)
facade.encrypt(999999)
if __name__ == '__main__':
print(__file__)
print("test start:")
test()
更多語言版本
不同語言實現(xiàn)設(shè)計模式對比,請關(guān)注:https://github.com/microwind/design-pattern