设计模式:外观模式(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  ?>

《完结》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/164917.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6 新特性重点部分

目录 一、ES6简介 二、ES6新特性 1.let变量声明 : 2.const常量声明 : 3.解构赋值 : 3.1 解构赋值简介 3.2 数组解构 3.3 对象解构 4.模板字符串 : 5.对象简写 : 6.运算符扩展 : 7.箭头函数 : 7.1 简介 7.2 实例 8.ES6---Promise : 9.ES6---模块化编程 : 一、ES6简介…

尚硅谷Flink(三)时间、窗口

1 &#x1f3b0;&#x1f3b2;&#x1f579;️ &#x1f3b0;时间、窗口 &#x1f3b2;窗口 &#x1f579;️是啥 Flink 是一种流式计算引擎&#xff0c;主要是来处理无界数据流的&#xff0c;数据源源不断、无穷无尽。想要更加方便高效地处理无界流&#xff0c;一种方式就…

ddns-go配合aliyun域名解析通过ipv6实现共享桌面

ddns-go配合aliyun域名解析通过ipv6实现共享桌面 前提&#xff1a; 必须拥有ipv6公网IP&#xff0c;测试IPv6 测试 (testipv6.cn) 如果是光猫拨号一点要选择ipv4和ipv6&#xff0c;同时要看光猫是否支持ipv6转发&#xff0c;如果不支持转发也不行&#xff0c;光猫不支持ipv6…

PC电脑 VMware安装的linux CentOs7如何扩容磁盘?

一、VM中进行扩容设置 必须要关闭当前CentOS&#xff0c;不然扩展按钮是灰色的。 输入值必须大于当前磁盘容量。然后点击扩展&#xff0c;等待扩展完成会提示一个弹框&#xff0c;点击确定&#xff0c;继续确定。 二、操作CentOS扩容——磁盘分区 第一步设置完成。那就启动 …

操作系统备考学习 day10

操作系统备考学习 day10 第三章 内存管理3.2 虚拟内存管理3.2.1 虚拟内存的基本概念传统存储管理方式的特征、缺点局部性原理虚拟内存的定义和特征如何实现虚拟内存技术 3.2.2 请求分页管理方式页表机制缺页中断机构地址变换机构 3.2.3 页面置换算法最佳置换算法&#xff08;OP…

ubuntu18.04 RTX3060 rangnet++训练 bonnetal语义分割

代码链接&#xff1a; https://github.com/PRBonn/lidar-bonnetal 安装anaconda环境为 CUDA 11.0&#xff08;11.1也可以&#xff09; anaconda环境如下 numpy1.17.2 torchvision0.2.2 matplotlib2.2.3 tensorflow1.13.1 scipy0.19.1 pytorch1.7.1 vispy0.5.3 opencv_python…

【五:Httprunner的介绍使用】

接口自动化框架封装思想的建立。httprunner&#xff08;热加载&#xff1a;动态参数&#xff09;&#xff0c;去应用 意义不大。 day1 一、什么是Httprunner? 1.httprunner是一个面向http协议的通用测试框架&#xff0c;目前最新的版本3.X。以前比较流行的 2.X的版本。2.它的…

开源的容器运行时项目 Podman

本心、输入输出、结果 文章目录 开源的容器运行时项目 Podman前言Podman 简介Podman 与 Docker 的区别Podman 在使用上和 Docker 有什么区别从构建者角度分析 Podman 在使用上和 Docker 有什么区别从使用者角度分析 Podman 在使用上和 Docker 有什么区别 Podman 常用命令容器镜…

maven 常用知识速记

创建项目 maven archetype:generate依赖范围 有如下依赖示例&#xff1a; <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.7</version><scope>test</scope> </dependency>其中…

18.项目开发之前端项目搭建测试

项目开发之前端项目搭建测试 解压文件&#xff0c;将前端项目目录&#xff0c;拖拽到HBuilder中 前端项目QuantTrade_vue地址&#xff1a;传送门 后端项目QuantTrade地址&#xff1a; https://pan.baidu.com/s/1GF45B0QepApH8JbRIOLY7w?pwd1016 开启idea的项目&#xff0c;先…

一个适合练手的接口测试实战项目——慕慕生鲜

前言 最近很多粉丝找小月要接口测试项目练练手&#xff0c;看看实力&#xff01;今天&#xff0c;它来了 慕慕生鲜&#xff0c;完整版&#xff0c;文末有福利&#xff01; 干货来咯&#xff0c;收藏好&#xff01; 1. 接口测试需求分析 常见接口文档提供的两种方式 ①wor…

四川竹哲电商:抖店怎么修改经营类目?

抖店是抖音推出的一款电商工具&#xff0c;通过抖店可以帮助商家在抖音上开展经营活动。在抖店平台上&#xff0c;商家需要选择经营类目&#xff0c;以便在相应的领域展示商品和提供服务。然而&#xff0c;有时候商家可能需要修改经营类目&#xff0c;以适应经营策略调整或扩大…

Linux进程(三)--进程切换命令行参数

继上回书Linux进程概念&#xff08;二&#xff09;--进程状态&进程优先级&#xff0c;我们在了解了Linux进程状态和优先级的概念&#xff0c;初步掌握了进程状态的相关知识&#xff0c;最终&#xff0c;我们以Linux进程的优先级&#xff0c;引出了一些其他的概念&#xff1…

Python---循环---while循环

Python中的循环 包括 while循环与for循环&#xff0c;本文以while循环为主。 Python中所有的知识点&#xff0c;都是为了解决某个问题诞生的&#xff0c;就好比中文的汉字&#xff0c;每个汉字都是为了解决某种意思表达而诞生的。 1、什么是循环 现实生活中&#xff0c;也有…

(N-128)基于springboot,vue酒店管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis 本系统功…

vueday02——使用NTableData

1.下载naivueui 2.按需导入&#xff0c;不要全局导入 注意不要导入错误组件或者写错组件名称 import { NDataTable } from naive-ui 3.定义表头和数据&#xff01;&#xff01;&#xff01; n-data-table标签必须要使用数据和数据 少一个都不能正确渲染&#xff01;&#xf…

ATA-M4功率放大器都有哪些具体特点及优势

我们的ATA-M系列功率放大器&#xff0c;旨在将它打造为超越ATA-L系列水声功率放大器高频限制的系列产品。其中ATA-M4功率放大器是一款理想的单通道功率放大器。最大输出345Vrms电压&#xff0c;400VA功率&#xff0c;可驱动0~100%的阻性或非阻性负载。输出阻抗匹配多个档位可选…

GCC优化相关

文章目录 优化选项博文链接 单独设置某段代码优化等级博文链接 优化选项 -O/-O0:无优化(默认)-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。该模式在编译大型程序的时候会花费更多的时间和内存。在-O1 下&#xff0c;编译会尝试减少代码体积和代码…

内核初始化的过程

内核的启动从入口函数 start_kernel() 开始。在 init/main.c 文件中&#xff0c;start_kernel 相当于内核的 main 函数。打开这个函数&#xff0c;你会发现&#xff0c;里面是各种各样初始化函数 XXXX_init。 在操作系统里面&#xff0c;先要有个创始进程&#xff0c;有一行指令…

JAVA发送消息到RabbitMq

项目中&#xff0c;作为生产者自定义消息发送到RabbitMq。 1.引入rmq依赖 <!-- rabbitmq 依赖 --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version></dependen…