设计模式:外观模式(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)
大家好!本节主要介绍设计模式中的外观模式。 简介: 外观模式,它是一种设计模式,它为子系统中的一组接口提供一个统一的、简单的接口。这种模式主张按照描述和判断资料来评价课程,关键活动是在课程实施的全过程中进行…...
Leetcode—34.在排序数组中查找元素的第一个和最后一个位置【中等】
2023每日刷题(六) 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语言学习书籍推荐如下: 《C程序设计语言》(The C Programming language):这本书由C语言创始人Brian W. Kernighan和Dennis M. Ritchie所写,是介绍标准C语言及其程序设计方法的权威性经典著作。《C陷阱与缺陷》&#…...
IntelliJ IDEA Maven加载超时问题
IDEA创建Maven项目遇到如下错误: 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中事务失效的几种场景及解决办法
未抛出异常:如果在一个带有事务的方法中没有抛出异常,Spring无法检测到事务失败,从而无法回滚。解决方法是确保在事务中遇到错误时抛出异常。 异常被捕获:如果在一个带有事务的方法中抛出异常,但被捕获并处理了&#…...
第五届太原理工大学程序设计竞赛新生赛(初赛)题解
第五届太原理工大学程序设计竞赛新生赛(初赛)题解 时隔半年重做一次,还是有几道不会,,,,, ⭐️A.饿饿饭饭 题目: 🌟题解: 很简单,签…...
微信小程序开发之后台数据交互及wxs应用
目录 一、后端准备 1. 应用配置 2. 数据源配置 二、数据库 1. 创建 2. 数据表 3. 数据测试 三、前端 1. 请求方法整合 2. 数据请求 3. WXS的使用 4. 样式美化 5. 页面 一、后端准备 通过SpringMVC及mybatis的技术学习,还有前后端分离的技术应用&…...
Java进阶篇--并发容器之ThreadLocal内存泄漏
目录 ThreadLocal内存泄漏的原因? 改进和优化 cleanSomeSlots方法 expungeStaleEntry方法 replaceStaleEntry方法 为什么使用弱引用? Thread.exit() ThreadLocal内存泄漏最佳解决方案 在使用完毕后立即清理ThreadLocal 使用InheritableThreadL…...
js实现红包雨功能(canvas,react,ts),包括图片不规则旋转、大小、转速、掉落速度控制、屏幕最大红包数量控制等功能
介绍 本文功能由canvas实现红包雨功能(index.tsx)本文为react的ts版。如有其他版本需求可评论区观赏地址,需过墙 import React, { Component } from react; // import ./index.css; import moneyx from /assets/images/RedEnvelopeRain/bal…...
【数字IC设计/FPGA】FIFO与流控机制
流控,简单来说就是控制数据流停止发送。常见的流控机制分为带内流控和带外流控。 FIFO的流水反压机制 一般来说,每一个fifo都有一个将满阈值afull_value(almost full)。当fifo内的数据量达到或超过afull_value时,将满…...
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 的主要属性 在前文中,我们大致了解了 Mat 的基本结构以及它的创建与赋值。接下来我们通过一个例子,来看看 Mat 所包含的常用属性。 先创建一个 3*4 的四通道的矩阵,并打印出其相关的属性,稍后会详细…...
基于指数分布优化的BP神经网络(分类应用) - 附代码
基于指数分布优化的BP神经网络(分类应用) - 附代码 文章目录 基于指数分布优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.指数分布优化BP神经网络3.1 BP神经网络参数设置3.2 指数分布算法应用 4.测试结果…...
Python--练习:使用while循环求1~100之间,所有偶数的和(涉及if判断是不是偶数)
案例:求1~100之间,所有偶数的和 思考: 先套用原有基础模式,之后再思考其他的。 其实就是在之前文章 Python--练习:使用while循环求1..100的和-CSDN博客 的基础上,再判断如果获取到里面的全部偶数&#…...
带温度的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 中,函数可以通过不同的方式进行调用。以下是常见的几种函数调用方式: 函数调用:使用函数名称后跟一对小括号来调用函数,这是最基本的调用方式。 functionName(); 方法调用:函数可以作为对象的方法进行调…...
聊聊设计模式--简单工厂模式
简单工厂模式 前面也学了很多各种微服务架构的组件,包括后续的服务部署、代码管理、Docker等技术,那么作为后端人员,最重要的任务还是代码编写能力,如何让你的代码写的漂亮、易扩展,让别人一看赏心悦目,…...
Python基础教程:内置函数之字典函数的使用方法
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 len(字典名): 返回键的个数,即字典的长度 # len(字典名): # 返回键的个数,即字典的长度dic {a:123,b:456,c:789…...
Pytorch从零开始实战06
Pytorch从零开始实战——明星识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——明星识别环境准备数据集模型选择开始训练模型可视化模型预测总结 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytorch2.0.1c…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
