簡介 外觀模式(Facade Pattern),也叫門面模式,是一種結構型設計模式。它向現有的系統添加一個高層介面,隱藏子系統的複雜性,這個介面使得子系統更加容易使用。 如果你需要一個指向複雜子系統的直接介面,且該介面的功能有限,則可以使用外觀模式。或者需要將子系統組織為多層結構,可以使用外觀。 作 ...
簡介
外觀模式(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