找回密码
 立即注册
首页 业界区 业界 【外观设计模式详解】C/Java/JS/Go/Python/TS不同语言实 ...

【外观设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

唐嘉懿 2025-6-6 09:40:05
简介

外观模式(Facade Pattern),也叫门面模式,是一种结构型设计模式。它向现有的系统添加一个高层接口,隐藏子系统的复杂性,这个接口使得子系统更加容易使用。
如果你需要一个指向复杂子系统的直接接口,且该接口的功能有限,则可以使用外观模式。或者需要将子系统组织为多层结构,可以使用外观。
 
作用


  • 让业务代码通过统一接口与内部子系统隔离。
  • 降低访问内部子系统时的复杂度,简化客户端之间的接口。
 
实现步骤


  • 创建统一外观接口和实现类,用于衔接调用方与子系统。
  • 创建不同子模块/子模块,这些子模块可以共同实现某通用接口,也可以各自独立。
  • 通过统一外观接口来访问这些复杂子类。
 
UML

1.png


 
 

Java代码

 
外观基础接口
  1. // AbstractFacade.java 外观模式的接口或抽象类,可选
  2. public interface AbstractFacade {
  3.    public void encoding(int id);
  4.    public void encrypt(int id);
  5. }
复制代码
 
 
外观模式实现类

 
  1. // Facade.java 外观模式实现类,是外部调用与内部子系统的衔接层
  2. public class Facade implements AbstractFacade {
  3.    private FileModule fileModule;
  4.    private NetworkModule networkModule;
  5.    private EncodeModule encodeModule;
  6.    public Facade() {
  7.       fileModule = new FileModule();
  8.       networkModule = new NetworkModule();
  9.       encodeModule = new EncodeModule();
  10.    }
  11.    public void encoding(int id) {
  12.       System.out.println(this.getClass().getName() + "::encoding() [id=" + id + "]");
  13.       networkModule.request();
  14.       fileModule.readFile();
  15.       encodeModule.encoding();
  16.       fileModule.saveFile();
  17.    }
  18.    public void encrypt(int id) {
  19.       System.out.println(this.getClass().getName() + "::encrypt() [id=" + id + "]");
  20.       fileModule.readFile();
  21.       encodeModule.encoding();
  22.    }
  23.    public FileModule getFileModule() {
  24.       return this.fileModule;
  25.    }
  26.    public NetworkModule getNetworkModule() {
  27.       return this.networkModule;
  28.    }
  29.    public EncodeModule getEncodeModule() {
  30.       return this.encodeModule;
  31.    }
  32. }
复制代码
 
几个具体模块类

 
  1. // FileModule.java 文件模块
  2. public class FileModule {
  3.    public void readFile() {
  4.       System.out.println(this.getClass().getName() + "::readFile() 读取文件。");
  5.    }
  6.    public void saveFile() {
  7.       System.out.println(this.getClass().getName() + "::saveFile() 保存文件。");
  8.    }
  9. }
  10. // EncodeModule.java 编码模块
  11. public class EncodeModule {
  12.    public void encoding() {
  13.       System.out.println(this.getClass().getName() + "::encoding() 进行编码处理。");
  14.    }
  15. }
  16. // NetworkModule.java 网络模块
  17. public class NetworkModule {
  18.    public void request() {
  19.       System.out.println(this.getClass().getName() + "::request() 远程读取。");
  20.    }
  21. }
复制代码
 
 
测试调用

 
  1.   /**
  2.    * 外观模式就是在外层添加一个访问接口类,客户通过这统一访问接口来访问这些复杂子类。
  3.    * 外观模式与适配器模式比较像,都是提供一个高层访问接口,隔绝外部客户与内部子类。
  4.    * 所不同是外观模式后面的类无需实现相同接口,只是把各种调用整合简化,而适配器需要是同一系列类,为的是解决接口不兼容。
  5.    * 这里声明外观类,外观类的方法里影藏了很多子类的调用。
  6.    */
  7.     AbstractFacade facade = new Facade();
  8.     facade.encoding(123456);
  9.     facade.encrypt(999999);
复制代码
 
 
Python代码

 
外观基础接口
  1. # AbstractFacade.py 外观模式的接口或抽象类,可选
  2. # 外观模式的接口或抽象类,可选
  3. from abc import abstractmethod, ABCMeta
  4. class AbstractFacade(metaclass=ABCMeta):
  5.     @abstractmethod
  6.     def encoding(self, id):
  7.         pass
  8.     @abstractmethod
  9.     def encrypt(id):
  10.         pass
复制代码
 
 
外观模式实现类

 
  1. # Facade.py 外观模式实现类,是外部调用与内部子系统的衔接层
  2. from src.AbstractFacade import AbstractFacade
  3. from src.FileModule import FileModule
  4. from src.NetworkModule import NetworkModule
  5. from src.EncodeModule import EncodeModule
  6. # 外观模式实现类,是外部调用与内部子系统的衔接层
  7. class Facade():
  8. # 继承抽象类可选
  9. # class Facade(AbstractFacade):
  10.     def __init__(self):
  11.         self.file_module = FileModule()
  12.         self.network_module = NetworkModule()
  13.         self.encode_module = EncodeModule()
  14.     def encoding(self, id):
  15.         print(self.__class__.__name__ + '::encoding() [id=' + str(id) + ']')
  16.         self.network_module.request()
  17.         self.file_module.read_file()
  18.         self.encode_module.encoding()
  19.         self.file_module.save_file()
  20.     def encrypt(self, id):
  21.         print(self.__class__.__name__ + '::encrypt() [id=' + str(id) + ']')
  22.         self.file_module.read_file()
  23.         self.encode_module.encoding()
  24.     def getfile_module(self):
  25.         return self.file_module
  26.     def getnetwork_module(self):
  27.         return self.network_module
  28.     def getencode_module(self):
  29.         return self.encode_module
复制代码
 
几个具体模块类

 
  1. # FileModule.py 文件模块
  2. class FileModule:
  3.     def read_file(self):
  4.         print(self.__class__.__name__ + '::read_file() 读取文件。')
  5.     def save_file(self):
  6.         print(self.__class__.__name__ + '::save_file() 保存文件。')
  7. # EncodeModule.py 编码模块
  8. class EncodeModule():
  9.     def encoding(self):
  10.         print(self.__class__.__name__ + '::encoding() 进行编码处理。')
  11. # NetworkModule.py 网络模块
  12. class NetworkModule:
  13.     def request(self):
  14.         print(self.__class__.__name__ + '::request() 远程读取。')
复制代码
 
测试调用

 
  1. import sys
  2. import os
  3. os_path = os.getcwd()
  4. sys.path.append(os_path)
  5. from src.Facade import Facade
  6. def test():
  7.     '''
  8.     * 外观模式就是在外层添加一个访问接口类,客户通过这统一访问接口来访问这些复杂子类。
  9.     * 外观模式与适配器模式比较像,都是提供一个高层访问接口,隔绝外部客户与内部子类。
  10.     * 所不同是外观模式后面的类无需实现相同接口,只是把各种调用整合简化,而适配器需要是同一系列类,为的是解决接口不兼容。
  11.     * 这里声明外观类,外观类的方法里影藏了很多子类的调用。
  12.     '''
  13.     facade = Facade()
  14.     facade.encoding(123456)
  15.     facade.encrypt(999999)
  16. if __name__ == '__main__':
  17.     print(__file__)
  18.     print("test start:")
  19.     test()
复制代码
 
更多语言版本

不同语言实现设计模式对比,请关注:https://github.com/microwind/design-pattern
 
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册