当前位置: 首页 >  网技达人 >  【外观设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

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

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

简介

外观模式(Facade Pattern),也叫门面模式,是一种结构型设计模式。它向现有的系统添加一个高层接口,隐藏子系统的复杂性,这个接口使得子系统更加容易使用。

如果你需要一个指向复杂子系统的直接接口,且该接口的功能有限,则可以使用外观模式。或者需要将子系统组织为多层结构,可以使用外观。

作用

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

实现步骤

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

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

上一篇:VSCode中的快捷键

下一篇:常用开发工具

内容
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 一种新的告警收敛方式“先知预警”,为您的系统健康护航
    一种新的告警收敛方式“先知预警”
    2023-12-08
    前言.简介.买基金,上京东.基金交易系统是用户使用京东金融APP进行基金交易的核心支撑系统,每天有数十亿元的交易额。.在
  • 读发布!设计与部署稳定的分布式系统(第2版)笔记26_安全性上
    读发布!设计与部署稳定的分布式系
    2023-12-07
    1. 安全问题.1.1. 系统违规并不总是涉及数据获取,有时会出现植入假数据,例如假身份或假运输文件.1.2. 必须在整
  • SSH教程0简介
    SSH教程0简介
    2023-12-06
    0 简介.OpenSSH (http://www.OpenSSH.com).已成为远程管理UNIX类系统和许多网络设备的
  • 安全测试前置实践1-白盒&黑盒扫描
    安全测试前置实践1-白盒&黑盒扫
    2023-12-04
    作者:京东物流 陈维.一、引言.G.J.Myers在《软件测试的艺术》中提出:从心理学角度来说,测试是一个为了寻找错误而
  • 密评相关要求介绍
    密评相关要求介绍
    2023-12-04
    密评相关要求介绍.项目建设单位需从物理和环境安全、网络和通信安全、设备和计算安全、应用和数据安全等四个层面采用密码技术措
  • 学系统集成项目管理工程师(中项)系列06a_信息系统安全管理(上)
    学系统集成项目管理工程师(中项)
    2023-12-04
    1. 信息安全.1.1. 保护信息的保密性、完整性、可用性.1.2. 另外也包括其他属性,如:真实性、可核查性、不可抵赖
  • 千乎万唤始出来,支持gpt3和gpt4支持画图,的在线gpt应用接入案例开源上线啦
    千乎万唤始出来,支持gpt3和g
    2023-12-04
    了解OPEN AI 平台用户一直在说,这个接口要怎么对接,如何在体验。 由于我一直忙于接口中台开发,所以在线基于OPEN
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 汽车ECU软件开发之应用层软件与底层软件
    汽车ECU软件开发之应用层软件与
    2023-12-03
    随着汽车产品日渐趋向电子化,人们对各类先进的安全系统、高级驾驶辅助系统的接受程度日益提升。而原本昂贵的盲点检测、自动紧急
  • 工业镜头篇之镜头焦距
    工业镜头篇之镜头焦距
    2023-12-03
    目录.图像采集系统.镜头等效分析.高斯光学公式.确定镜头焦距.凸透镜的球差.对焦和变焦.参考资料.图像采集系统.镜头等效
  • 智慧园区楼宇合集 | 图扑数字孪生管控系统
    智慧园区楼宇合集 | 图扑数字孪
    2023-12-03
    智慧园区是指将物联网、大数据、人工智能等技术应用于传统建筑和基础设施,以实现对园区的全面监控、管理和服务的一种建筑形态。
  • 1.5 编写自定位ShellCode弹窗
    1.5 编写自定位ShellCo
    2023-12-02
    在笔者上一篇文章中简单的介绍了如何运用汇编语言编写一段弹窗代码,虽然简易ShellCode可以被正常执行,但却存在很多问
  • 主动发现系统稳定性缺陷:混沌工程
    主动发现系统稳定性缺陷:混沌工程
    2023-12-01
    这是一篇较为详细的混沌工程调研报告,包含了背景,现状,京东混沌工程实践,希望帮助大家更好的了解到混沌工程技术,通过混沌工
  • 基于深度学习的口罩检测系统(Python+清新界面+数据集)
    基于深度学习的口罩检测系统(Py
    2023-12-01
    摘要:口罩检测系统用于日常生活中检测行人是否规范佩戴口罩,利用深度学习算法可实现图片、视频、连接摄像头等方式的口罩检测,
  • 女童裤子
    女童裤子
    2024-01-10
    女童裤子.产品介绍.我们的女童裤子是为年龄在3-12岁之间的女孩设计的。我们的裤子不仅样式多样,而且舒适耐穿,适合学校、
  • 儿童运动服
    儿童运动服
    2023-12-16
    儿童运动服.产品功能.我们的儿童运动服采用高品质的面料和工艺制作而成,具有出色的透气性和舒适性,可以让孩子在运动中保持干
  • 裙子
    裙子
    2023-12-16
    裙子.产品描述.我们的裙子采用高品质的面料制成,款式多样,适合各种场合穿着。无论是休闲的街头漫步,还是正式的商务会议,我
  • 短裤
    短裤
    2023-12-11
    时尚舒适,尽显运动魅力——短裤.产品功能.透气吸汗:采用透气材质制作,有效吸收汗液,让您在运动中保持干爽舒适。.伸缩自如
  • 风衣
    风衣
    2023-12-21
    风衣.产品功能.透气性高,能够有效排出体内热量和汗液,保持身体舒适.防风防水,能够有效阻挡外界风雨,保护身体不受天气影响
  • 儿童外套
    儿童外套
    2023-12-06
    儿童外套.产品功能.我们的儿童外套具有多种功能,包括保暖、防风、防水和舒适。它们采用高质量的面料制成,能够有效地抵御寒冷
  • 外套
    外套
    2023-12-06
    外套.外套是一种经典的服装单品,不仅给人温暖的保护,还可以提升整体的时尚感。我们的外套采用高品质的材料和工艺**而成,既
  • 儿童T恤
    儿童T恤
    2023-12-26
    儿童T恤.儿童T恤是一种专门为儿童设计的上衣,具有舒适、时尚、环保等特点,是孩子们*常穿着的必备单品。.产品功能.儿童T
  • 衬衫
    衬衫
    2023-12-31
    产品介绍:衬衫.产品功能.衬衫是一种适合各种场合穿着的服装,既可以正式地穿在工作场所,也可以搭配牛仔裤穿在休闲场合。.衬
  • 休闲鞋
    休闲鞋
    2024-01-05
    休闲鞋 - 轻松舒适的时尚选择.产品功能.休闲鞋 是一款适合各种活动的多功能鞋,其设计灵感来源于慢生活和自由精神。采用轻