【外觀設(shè)計模式詳解】C/Java/JS/Go/Python/TS不同語言實現(xiàn)

【外觀設(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),可以使用外觀。

作用

  1. 讓業(yè)務(wù)代碼通過統(tǒng)一接口與內(nèi)部子系統(tǒng)隔離。
  2. 降低訪問內(nèi)部子系統(tǒng)時的復(fù)雜度,簡化客戶端之間的接口。

實現(xiàn)步驟

  1. 創(chuàng)建統(tǒng)一外觀接口和實現(xiàn)類,用于銜接調(diào)用方與子系統(tǒng)。
  2. 創(chuàng)建不同子模塊/子模塊,這些子模塊可以共同實現(xiàn)某通用接口,也可以各自獨立。
  3. 通過統(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容