当前位置: 首页 > news >正文

设计模式:外观模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

大家好!本节主要介绍设计模式中的外观模式。

简介:

外观模式,它是一种设计模式,它为子系统中的一组接口提供一个统一的、简单的接口。这种模式主张按照描述和判断资料来评价课程,关键活动是在课程实施的全过程中进行观察和搜集意见,以了解人们对课程的不同看法。

外观模式的使用场景:
1、当你需要为一个复杂的子系统提供一个简单的接口时。它允许你简化一些复杂的操作或过程,使得在使用这个子系统时无需了解其内部细节。
2、当你的系统需要与其他系统进行交互时。通过为外部系统提供一个统一的接口,可以使得内部子系统与外部系统的交互更加简单和直接。
3、当你需要对一个大型遗留系统进行维护和扩展时。这种情况下,为新系统创建一个外观类可能更为实用,它可以封装原有系统的复杂性,并为新系统提供简单的接口。
这种模式在设计和开发过程中可以发挥很大的作用,帮助开发者更好地组织和管理代码,提高系统的可维护性和可扩展性。

外观模式的创建步骤:
1、定义一个外观类(Facade),这个类将为子系统中的每个类定义一个方法。
2、在外观类中,定义一些方法,这些方法将被客户端调用。这些方法将被子系统中的类实现。
3、在客户端代码中,使用外观类的方法来调用子系统中的方法。

外观模式的优点,主要包括:
1、简化子系统使用:为子系统提供了一个简单的接口,使得客户端可以更容易地使用子系统而无需了解其内部细节。
2、增强了子系统的松耦合:通过外观类,将客户端与子系统之间的关系解耦,客户端只需要和外观类进行交互,无需直接和子系统中的类打交道。
3、增加了安全性:通过将子系统的内部实现细节隐藏在外观类之后,可以防止客户端直接访问和修改子系统的内部状态。
4、隐藏子系统实现:外观模式隐藏了子系统的实现细节,只向客户端暴露必要的接口,从而保护了子系统的完整性。
5、提高了代码的可读性和可维护性:通过使用外观模式,代码变得更加结构化,易于阅读和维护。
6、减少了客户端和子系统之间的代码复杂度:通过将客户端和子系统之间的复杂交互抽象为一个或几个简单的方法调用,减少了客户端和子系统之间的代码复杂度。
7、符合迪米特法则:外观模式符合迪米特法则(最少知道原则),使得客户端需要处理的类数量减少,降低了系统的耦合性。

外观模式的缺点,主要包括:
1、子系统扩展风险:当子系统需要扩展时,可能会对原有系统的功能造成影响。
2、不符合开闭原则:在需要修改子系统时,可能也需要修改外观类,这不符合开闭原则。
3、降低了子系统的可维护性:外观模式使得子系统的内部结构和实现细节更加难以被了解和维护。
4、增加了代码的复杂性:外观模式的实现需要增加额外的类和方法,这会增加代码的复杂性和维护难度。
5、降低了代码的可读性:如果外观类的设计和实现不够清晰,可能会使得代码的可读性更加困难。
6、增加了额外的开销:外观模式的实现和运行需要额外的开销,例如需要额外的方法调用和处理等。

示例:

一、C#外观模式

以下是一个示例,展示了如何在C#中实现外观模式:

public interface ISubsystem1  
{  void Operation1();  
}  public interface ISubsystem2  
{  void Operation2();  
}  public interface ISubsystem3  
{  void Operation3();  
}  public class Subsystem1 : ISubsystem1  
{  public void Operation1()  {  Console.WriteLine("Subsystem1.Operation1");  }  
}  public class Subsystem2 : ISubsystem2  
{  public void Operation2()  {  Console.WriteLine("Subsystem2.Operation2");  }  
}  public class Subsystem3 : ISubsystem3  
{  public void Operation3()  {  Console.WriteLine("Subsystem3.Operation3");  }  
}  public class Facade  
{  private ISubsystem1 _subsystem1;  private ISubsystem2 _subsystem2;  private ISubsystem3 _subsystem3;  public Facade()  {  _subsystem1 = new Subsystem1();  _subsystem2 = new Subsystem2();  _subsystem3 = new Subsystem3();  }  public void SimpleOperation()  {  _subsystem1.Operation1();  _subsystem2.Operation2();  _subsystem3.Operation3();  }  
}public class Client {  public void test() {  Facade facade = new Facade();  facade.SimpleOperation();  }  
}

二、java外观模式

外观模式通常通过以下方式实现:

// 子系统中的组件类  
class SubsystemComponent1 {  public void operation1() {  System.out.println("SubsystemComponent1.operation1");  }  
}  class SubsystemComponent2 {  public void operation2() {  System.out.println("SubsystemComponent2.operation2");  }  
}  class SubsystemComponent3 {  public void operation3() {  System.out.println("SubsystemComponent3.operation3");  }  
}  // 外观类  
class Facade {  private SubsystemComponent1 component1;  private SubsystemComponent2 component2;  private SubsystemComponent3 component3;  public Facade() {  component1 = new SubsystemComponent1();  component2 = new SubsystemComponent2();  component3 = new SubsystemComponent3();  }  public void simplifiedOperation() {  component1.operation1();  component2.operation2();  component3.operation3();  }  
}  // 客户端代码  
public class Client {  public static void main(String[] args) {  Facade facade = new Facade();  facade.simplifiedOperation();  }  
}

三、javascript外观模式

在JavaScript实现外观模式的示例:

// 子系统中的组件  
const Component1 = {  operation1: function() {  console.log('Component1.operation1');  }  
};  const Component2 = {  operation2: function() {  console.log('Component2.operation2');  }  
};  const Component3 = {  operation3: function() {  console.log('Component3.operation3');  }  
};  // 外观类  
const Facade = {  constructor() {  this.component1 = new Component1;  this.component2 = new Component2;  this.component3 = new Component3;  },  simplifiedOperation: function() {  this.component1.operation1();  this.component2.operation2();  this.component3.operation3();  }  
};  // 客户端代码  
const facade = new Facade;  
facade.simplifiedOperation(); // 输出:Component1.operation1 Component2.operation2 Component3.operation3

四、C++外观模式

以下是在C++中实现外观模式:

#include <iostream>  // 子系统中的组件类  
class Component1 {  
public:  void operation1() {  std::cout << "Component1.operation1" << std::endl;  }  
};  class Component2 {  
public:  void operation2() {  std::cout << "Component2.operation2" << std::endl;  }  
};  class Component3 {  
public:  void operation3() {  std::cout << "Component3.operation3" << std::endl;  }  
};  // 外观类  
class Facade {  
public:  Facade() {  component1 = new Component1;  component2 = new Component2;  component3 = new Component3;  }  ~Facade() {  delete component1;  delete component2;  delete component3;  }  void simplifiedOperation() {  component1->operation1();  component2->operation2();  component3->operation3();  }  private:  Component1* component1;  Component2* component2;  Component3* component3;  
};  // 客户端代码  
int main() {  Facade facade;  facade.simplifiedOperation(); // 输出:Component1.operation1 Component2.operation2 Component3.operation3  return 0;  
}

五、python外观模式

以下是在python中实现外观模式:

# 子系统中的组件  
class Component1:  def operation1(self):  print("Component1.operation1")  class Component2:  def operation2(self):  print("Component2.operation2")  class Component3:  def operation3(self):  print("Component3.operation3")  # 外观类  
class Facade:  def __init__(self):  self.component1 = Component1()  self.component2 = Component2()  self.component3 = Component3()  def simplified_operation(self):  self.component1.operation1()  self.component2.operation2()  self.component3.operation3()  # 客户端代码  
if __name__ == '__main__':  facade = Facade()  facade.simplified_operation() # 输出:Component1.operation1 Component2.operation2 Component3.operation3

六、go外观模式

以下是一个示例,展示了如何在go中实现外观模式:

// 子系统中的组件  
type Component1 struct{}  func (c *Component1) Operation1() {  fmt.Println("Component1.Operation1")  
}  type Component2 struct{}  func (c *Component2) Operation2() {  fmt.Println("Component2.Operation2")  
}  type Component3 struct{}  func (c *Component3) Operation3() {  fmt.Println("Component3.Operation3")  
}  // 外观类  
type Facade struct {  component1 *Component1  component2 *Component2  component3 *Component3  
}  func (f *Facade) SimpleOperation() {  f.component1.Operation1()  f.component2.Operation2()  f.component3.Operation3()  
}  // 客户端代码  
func main() {  facade := &Facade{  component1: &Component1{},  component2: &Component2{},  component3: &Component3{},  }  facade.SimpleOperation() // 输出:Component1.Operation1 Component2.Operation2 Component3.Operation3  
}

七、PHP外观模式

以下是一个示例,展示了如何在PHP中实现外观模式:

<?php  // 子系统中的类  
class Subsystem1 {  public function operation1() {  echo "Subsystem1.operation1\n";  }  
}  class Subsystem2 {  public function operation2() {  echo "Subsystem2.operation2\n";  }  
}  class Subsystem3 {  public function operation3() {  echo "Subsystem3.operation3\n";  }  
}  // 外观类  
class Facade {  private $subsystem1;  private $subsystem2;  private $subsystem3;  public function __construct() {  $this->subsystem1 = new Subsystem1();  $this->subsystem2 = new Subsystem2();  $this->subsystem3 = new Subsystem3();  }  public function simplifiedOperation() {  $this->subsystem1->operation1();  $this->subsystem2->operation2();  $this->subsystem3->operation3();  }  
}  // 客户端代码  
$facade = new Facade();  
$facade->simplifiedOperation(); // 输出:Subsystem1.operation1 Subsystem2.operation2 Subsystem3.operation3  ?>

《完结》

相关文章:

设计模式:外观模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

大家好&#xff01;本节主要介绍设计模式中的外观模式。 简介&#xff1a; 外观模式&#xff0c;它是一种设计模式&#xff0c;它为子系统中的一组接口提供一个统一的、简单的接口。这种模式主张按照描述和判断资料来评价课程&#xff0c;关键活动是在课程实施的全过程中进行…...

Leetcode—34.在排序数组中查找元素的第一个和最后一个位置【中等】

2023每日刷题&#xff08;六&#xff09; Leetcode—34.在排序数组中查找元素的第一个和最后一个位置 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int lower_bound(int *arr, int numsSize, int target) {// 左闭右开区间[lef…...

Java 8 新特性 Ⅱ

方法引用 举例: Integer :: compare 理解: 可以看作是基于lambda表达式的进一步简化 当需要提供一个函数式接口的实例时, 可以使用lambda表达式提供实例 当满足一定条件下, 可以使用方法引用or构造器引用替换lambda表达式 实质: 方法引用作为函数式接口的实例 (注: 需要熟悉…...

C语言学习书籍推荐

C语言学习书籍推荐如下&#xff1a; 《C程序设计语言》&#xff08;The C Programming language&#xff09;&#xff1a;这本书由C语言创始人Brian W. Kernighan和Dennis M. Ritchie所写&#xff0c;是介绍标准C语言及其程序设计方法的权威性经典著作。《C陷阱与缺陷》&#…...

IntelliJ IDEA Maven加载超时问题

IDEA创建Maven项目遇到如下错误&#xff1a; Could not transfer artifact org.apache.maven.plugins:maven-compiler-plugin:pom:3.10.1 from/to central (Central Repository:): Connect to repo.maven.apache.org:443 [repo.maven.apache.org/146.75.112.215] failed: conn…...

Spring中事务失效的几种场景及解决办法

未抛出异常&#xff1a;如果在一个带有事务的方法中没有抛出异常&#xff0c;Spring无法检测到事务失败&#xff0c;从而无法回滚。解决方法是确保在事务中遇到错误时抛出异常。 异常被捕获&#xff1a;如果在一个带有事务的方法中抛出异常&#xff0c;但被捕获并处理了&#…...

第五届太原理工大学程序设计竞赛新生赛(初赛)题解

第五届太原理工大学程序设计竞赛新生赛&#xff08;初赛&#xff09;题解 时隔半年重做一次&#xff0c;还是有几道不会&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c; ⭐️A.饿饿饭饭 题目&#xff1a; &#x1f31f;题解&#xff1a; 很简单&#xff0c;签…...

微信小程序开发之后台数据交互及wxs应用

目录 一、后端准备 1. 应用配置 2. 数据源配置 二、数据库 1. 创建 2. 数据表 3. 数据测试 三、前端 1. 请求方法整合 2. 数据请求 3. WXS的使用 4. 样式美化 5. 页面 一、后端准备 通过SpringMVC及mybatis的技术学习&#xff0c;还有前后端分离的技术应用&…...

Java进阶篇--并发容器之ThreadLocal内存泄漏

目录 ThreadLocal内存泄漏的原因&#xff1f; 改进和优化 cleanSomeSlots方法 expungeStaleEntry方法 replaceStaleEntry方法 为什么使用弱引用&#xff1f; Thread.exit() ThreadLocal内存泄漏最佳解决方案 在使用完毕后立即清理ThreadLocal 使用InheritableThreadL…...

js实现红包雨功能(canvas,react,ts),包括图片不规则旋转、大小、转速、掉落速度控制、屏幕最大红包数量控制等功能

介绍 本文功能由canvas实现红包雨功能&#xff08;index.tsx&#xff09;本文为react的ts版。如有其他版本需求可评论区观赏地址&#xff0c;需过墙 import React, { Component } from react; // import ./index.css; import moneyx from /assets/images/RedEnvelopeRain/bal…...

【数字IC设计/FPGA】FIFO与流控机制

流控&#xff0c;简单来说就是控制数据流停止发送。常见的流控机制分为带内流控和带外流控。 FIFO的流水反压机制 一般来说&#xff0c;每一个fifo都有一个将满阈值afull_value&#xff08;almost full&#xff09;。当fifo内的数据量达到或超过afull_value时&#xff0c;将满…...

C++笔记之遍历vector的所有方式

C笔记之遍历vector的所有方式 —— 2023年4月15日 上海 code review 文章目录 C笔记之遍历vector的所有方式1.普通for循环2.迭代器版3.const迭代器4.C11引入的范围for循环5.使用auto关键字和迭代器6.使用std::for_each算法7.使用std::for_each和lambda表达式8.普通版vector::at…...

OpenCV 笔记(2):图像的属性以及像素相关的操作

Part11. 图像的属性 11.1 Mat 的主要属性 在前文中&#xff0c;我们大致了解了 Mat 的基本结构以及它的创建与赋值。接下来我们通过一个例子&#xff0c;来看看 Mat 所包含的常用属性。 先创建一个 3*4 的四通道的矩阵&#xff0c;并打印出其相关的属性&#xff0c;稍后会详细…...

基于指数分布优化的BP神经网络(分类应用) - 附代码

基于指数分布优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于指数分布优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.指数分布优化BP神经网络3.1 BP神经网络参数设置3.2 指数分布算法应用 4.测试结果…...

Python--练习:使用while循环求1~100之间,所有偶数的和(涉及if判断是不是偶数)

案例&#xff1a;求1~100之间&#xff0c;所有偶数的和 思考&#xff1a; 先套用原有基础模式&#xff0c;之后再思考其他的。 其实就是在之前文章 Python--练习&#xff1a;使用while循环求1..100的和-CSDN博客 的基础上&#xff0c;再判断如果获取到里面的全部偶数&#…...

带温度的softmax

用pytorch写一下使用带有温度的softmax的demo import torch import torch.nn.functional as F# 定义带有温度的softmax函数 def temperature_softmax(logits, temperature1.0):return F.softmax(logits / temperature, dim-1)# 输入logits logits torch.tensor([[1.0, 2.0, 3.…...

js函数调用的方式有几种

在 JavaScript 中&#xff0c;函数可以通过不同的方式进行调用。以下是常见的几种函数调用方式&#xff1a; 函数调用&#xff1a;使用函数名称后跟一对小括号来调用函数&#xff0c;这是最基本的调用方式。 functionName(); 方法调用&#xff1a;函数可以作为对象的方法进行调…...

聊聊设计模式--简单工厂模式

简单工厂模式 ​ 前面也学了很多各种微服务架构的组件&#xff0c;包括后续的服务部署、代码管理、Docker等技术&#xff0c;那么作为后端人员&#xff0c;最重要的任务还是代码编写能力&#xff0c;如何让你的代码写的漂亮、易扩展&#xff0c;让别人一看赏心悦目&#xff0c…...

Python基础教程:内置函数之字典函数的使用方法

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 len(字典名)&#xff1a; 返回键的个数&#xff0c;即字典的长度 # len(字典名)&#xff1a; # 返回键的个数&#xff0c;即字典的长度dic {a:123,b:456,c:789…...

Pytorch从零开始实战06

Pytorch从零开始实战——明星识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——明星识别环境准备数据集模型选择开始训练模型可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch2.0.1c…...

维修案例---win11安全中心空白恢复办法

客户安装声卡软件驱动需要进windows 安全中心设置,打开windows安全中心 显示空白 界面以下是解决办法&#xff1a;需要再注册表修改两处。按下 键盘Win R 组合键&#xff0c;输入&#xff1a;regedit找到 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wscsvc…...

【通信】基于卡尔曼的混合预编码技术用于多用户毫米波大规模MIMO系统研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

嘉善老房翻新咨询哪家

在嘉善&#xff0c;许多老房子承载着几代人的记忆&#xff0c;但随着时间推移&#xff0c;这些老房往往面临着设施老化、空间布局不合理等问题。当您考虑对老房进行翻新时&#xff0c;选择一个既懂设计又懂施工的装修团队至关重要。嘉善老房翻新的专业选择如果您正在嘉善寻找老…...

手把手用GD32F307C-EVAL板调试Timer0互补PWM(含死区与刹车功能)

基于GD32F307C-EVAL实现高级定时器互补PWM全流程实战 最近在电机控制项目中尝试使用GD32F307的高级定时器功能&#xff0c;发现其互补PWM输出配合死区时间与刹车保护的组合应用&#xff0c;能显著提升系统可靠性。本文将用开发板上的TIMER0为例&#xff0c;演示从硬件连接到波形…...

高效AI专著生成:实测4款工具,3天完成20万字专著写作!

在学术界&#xff0c;撰写一本专著对于研究者来说&#xff0c;绝不是一时冲动的结果&#xff0c;而是需要几年努力的“耐力赛”。从最早的选题阶段&#xff0c;到构建一个逻辑条理清晰的章节结构&#xff0c;再到逐步填充具体内容和校对文献引用&#xff0c;每一步都充满不小的…...

2026 年 4 月 GEO 优化服务商实力榜单:服务方案与实战成果双维评估

2026 年&#xff0c;生成式 AI 深度重构信息获取与消费决策&#xff0c;GEO 生成式引擎优化已成为企业数字化布局的核心战略。当前 AI 搜索占据全球 40% 流量&#xff0c;国内 GEO 市场规模预计达 286 亿元&#xff0c;企业普遍面临品牌失声、信息失真、流量黑箱、技术不足等痛…...

Windows 10终极去臃肿方案:Windows10Debloater专业深度指南

Windows 10终极去臃肿方案&#xff1a;Windows10Debloater专业深度指南 【免费下载链接】Windows10Debloater Script to remove Windows 10 bloatware. 项目地址: https://gitcode.com/gh_mirrors/wi/Windows10Debloater Windows 10系统预装的"臃肿软件"问题一…...

Source Han Serif CN:7种字重免费开源宋体解决中文排版难题

Source Han Serif CN&#xff1a;7种字重免费开源宋体解决中文排版难题 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文排版找不到合适的免费字体而苦恼吗&#xff1f;Sourc…...

C++20标准中的范围(Ranges)库:功能与应用概览

C20标准中的范围&#xff08;Ranges&#xff09;库&#xff1a;功能与应用概览 引言 C作为一门历史悠久且广泛应用的编程语言&#xff0c;其标准库不断演进以满足现代编程的需求。C20标准引入了一个重要的新特性——范围&#xff08;Ranges&#xff09;库&#xff0c;它为处理序…...

Mac/Linux用户的应急工具箱:当老板发来一个加密zip忘了密码,用fcrackzip的3种找回方法

Mac/Linux用户的应急工具箱&#xff1a;用fcrackzip破解加密zip的3种实战策略 上周五下午4点52分&#xff0c;市场部的Lisa突然在Slack上弹出一条消息&#xff1a;"紧急&#xff01;季度财报分析.zip的密码老板记不清了&#xff0c;能帮帮忙吗&#xff1f;" 这种场景…...