簡介
外觀模式(Facade Pattern),也叫門面模式,是一種結構型設計模式,它向現有的系統添加一個高層介面,隱藏子系統的復雜性,這個介面使得子系統更加容易使用,
如果你需要一個指向復雜子系統的直接介面,且該介面的功能有限,則可以使用外觀模式,或者需要將子系統組織為多層結構,可以使用外觀,
作用
- 讓業務代碼通過統一介面與內部子系統隔離,
- 降低訪問內部子系統時的復雜度,簡化客戶端之間的介面,
實作步驟
- 創建統一外觀介面和實作類,用于銜接呼叫方與子系統,
- 創建不同子模塊/子模塊,這些子模塊可以共同實作某通用介面,也可以各自獨立,
- 通過統一外觀介面來訪問這些復雜子類,
UML
Java代碼
外觀基礎介面
// AbstractFacade.java 外觀模式的介面或抽象類,可選 public interface AbstractFacade { public void encoding(int id); public void encrypt(int id); }
外觀模式實作類
// Facade.java 外觀模式實作類,是外部呼叫與內部子系統的銜接層 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() 進行編碼處理,"); } } // NetworkModule.java 網路模塊 public class NetworkModule { public void request() { System.out.println(this.getClass().getName() + "::request() 遠程讀取,"); } }
測驗呼叫
/** * 外觀模式就是在外層添加一個訪問介面類,客戶通過這統一訪問介面來訪問這些復雜子類, * 外觀模式與配接器模式比較像,都是提供一個高層訪問介面,隔絕外部客戶與內部子類, * 所不同是外觀模式后面的類無需實作相同介面,只是把各種呼叫整合簡化,而配接器需要是同一系列類,為的是解決介面不兼容, * 這里宣告外觀類,外觀類的方法里影藏了很多子類的呼叫, */ AbstractFacade facade = new Facade(); facade.encoding(123456); facade.encrypt(999999);
Python代碼
外觀基礎介面
# AbstractFacade.py 外觀模式的介面或抽象類,可選 # 外觀模式的介面或抽象類,可選 from abc import abstractmethod, ABCMeta class AbstractFacade(metaclass=ABCMeta): @abstractmethod def encoding(self, id): pass @abstractmethod def encrypt(id): pass
外觀模式實作類
# Facade.py 外觀模式實作類,是外部呼叫與內部子系統的銜接層 from src.AbstractFacade import AbstractFacade from src.FileModule import FileModule from src.NetworkModule import NetworkModule from src.EncodeModule import EncodeModule # 外觀模式實作類,是外部呼叫與內部子系統的銜接層 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() 進行編碼處理,') # NetworkModule.py 網路模塊 class NetworkModule: def request(self): print(self.__class__.__name__ + '::request() 遠程讀取,')
測驗呼叫
import sys import os os_path = os.getcwd() sys.path.append(os_path) from src.Facade import Facade def test(): ''' * 外觀模式就是在外層添加一個訪問介面類,客戶通過這統一訪問介面來訪問這些復雜子類, * 外觀模式與配接器模式比較像,都是提供一個高層訪問介面,隔絕外部客戶與內部子類, * 所不同是外觀模式后面的類無需實作相同介面,只是把各種呼叫整合簡化,而配接器需要是同一系列類,為的是解決介面不兼容, * 這里宣告外觀類,外觀類的方法里影藏了很多子類的呼叫, ''' facade = Facade() facade.encoding(123456) facade.encrypt(999999) if __name__ == '__main__': print(__file__) print("test start:") test()
更多語言版本
不同語言實作設計模式對比,請關注:https://github.com/microwind/design-pattern
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/549460.html
標籤:其他

