目錄
外觀模式(Facade Pattern)
外觀模式的核心角色:
優缺點
使用場景
代碼實現
外觀模式(Facade Pattern)
????????外觀模式(Facade Pattern)又叫作門面模式,是一種通過為多個復雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,用于訪問子系統中的一組接口,外部應用程序不用關心內部子系統的具體細節,這樣會大大降低應用程序的復雜度,提高了程序的可維護性。
外觀模式的核心角色:
- 外觀(Facade):外觀對象是客戶端與子系統之間的中間層,它提供了一個簡化的接口,將客戶端的請求委派給子系統處理,用于訪問子系統中的一組接口。外觀對象知道哪些子系統類負責處理請求,并將請求分派給它們。
- 子系統(Subsystem):包含一組類或接口,實現了子系統的功能。子系統是實現具體功能的一組類或接口。外觀對象將客戶端的請求轉發給適當的子系統類進行處理。
優缺點
(1)優點:
- 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。
- 對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,并使得子系統使用起來更加容易。
- 降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因為編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。
(2)缺點:
- 不能很好地限制客戶使用子系統類,很容易帶來未知風險。
- 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
使用場景
- 為復雜的模塊或子系統提供外界訪問的模塊。
- 子系統相對獨立。
- 預防低水平人員帶來的風險。
代碼實現
package mainimport "fmt"// 一個文件壓縮工具,需要提供壓縮和解壓縮功能。壓縮功能涉及到文件的讀取、壓縮算法的選擇和壓縮文件的寫入,
// 而解壓縮功能涉及到文件的讀取、解壓縮算法的選擇和解壓縮文件的寫入。我們希望能夠通過一個簡單的接口來調用這些復雜的功能。// 子系統:文件讀取
type FileReader struct {
}func (f *FileReader) ReadFile(fileName string) string {return "File Content"
}// 子系統:壓縮算法
type Compressor struct {
}func (c *Compressor) Compress(data string) string {return "Compressed Data"
}// 子系統:文件寫入
type FileWriter struct {
}func (w *FileWriter) WriteFile(fileName string, data string) {fmt.Printf("Write data '%s' to file '%s'\n", data, fileName)
}// 外觀:文件壓縮工具
type FileCompressionFacade struct {reader *FileReadercompressor *Compressorwriter *FileWriter
}func NewFileCompressionFacade() *FileCompressionFacade {return &FileCompressionFacade{reader: &FileReader{},compressor: &Compressor{},writer: &FileWriter{},}
}
func (f *FileCompressionFacade) CompressFile(fileName string) {fmt.Println("Compressing file:", fileName)// 讀取文件data := f.reader.ReadFile(fileName)// 壓縮數據compressedData := f.compressor.Compress(data)// 寫入壓縮文件f.writer.WriteFile(fileName+".zip", compressedData)fmt.Println("File compression completed.")
}// 客戶端代碼
func main() {facade := NewFileCompressionFacade()facade.CompressFile("example.txt")
}