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

news2024/11/18 3:31:51

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

简介:

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

外观模式的使用场景:
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.coloradmin.cn/o/1115555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言必知必会 | 第八篇】一文带你精通循环结构

引言 C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】系列第八篇&#xff0c;进行C语言循环结构的专项练习&#xff0c;结合专题优质题目&#xff0c;带领读者从0开始&#xff0…

丰富功能带来新奇体验,乐划锁屏持续引领行业潮流

在日常使用手机的过程中,为了省电或在口袋里误触,不少用户都会对手机进行锁屏,有这么一款锁屏软件,不仅能够解决以上功能性问题,还有不少其他新奇的功能,那就是乐划锁屏。 现在“手机不离手”、每天翻看手机上百遍的年轻人,最喜欢关注什么样的内容呢?乐划锁屏以图片和视频为主…

RabbitMQ官方案例学习记录

官方文档&#xff1a;RabbitMQ教程 — RabbitMQ (rabbitmq.com) 一、安装RabbitMQ服务 直接使用docker在服务器上安装 docker run -it -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management 安装完成后&#xff0c;访问15672端口&#xff0c;默认用户…

实时数据更新与Apollo:探索GraphQL订阅

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

FIFO设计16*8,verilog,源码和视频

名称&#xff1a;FIFO设计16*8&#xff0c;数据显示在数码管 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 使用verilog语言设计一个16*8的FIFO&#xff0c;深度16&#xff0c;宽度为8。可对FIFO进行写和读&#xff0c;并将FIFO读出的数据显示到…

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目

文章目录 前言一、雪崩问题及其解决方案1.1 什么是雪崩问题1.2 雪崩问题的原因1.3 解决雪崩问题的方法1.4 总结 二、初识 Sentinel 框架2.1 什么是 Sentinel2.2 Sentinel 和 Hystrix 的对比 三、Sentinel 的安装部署四、集成 Sentinel 到微服务 前言 微服务架构在现代软件开发…

Rust通用编程概念

文章目录 变量与可变性数据类型标量类型整数类型浮点类型布尔类型字符类型 复合类型元组数组 函数注释控制流if表达式循环 变量与可变性 变量与可变性 在Rust中&#xff0c;声明变量使用let关键字&#xff0c;并且默认情况下&#xff0c;声明的变量是不可变的&#xff0c;要使变…

C语言实现用递归法将一个整数 n 转换成字符串。例如,输入 483,应输出字符串“483“。n 的位数不确定,可以是任意位数的整数

完整代码&#xff1a; /*用递归法将一个整数 n 转换成字符串。例如&#xff0c;输入 483&#xff0c;应输出字符串"483"。n 的 位数不确定&#xff0c;可以是任意位数的整数。*/ #include<stdio.h> //long long int让n的取值范围更广 void func(long long int…

手搭手zabbix5.0监控redis7

Centos7安装配置Redis7 安装redis #安装gcc yum -y install gcc gcc-c #安装net-tools yum -y install net-tools #官网https://redis.io/ cd /opt/ wget http://download.redis.io/releases/redis-7.0.4.tar.gz 解压至/opt/目录下 tar -zxvf redis-7.0.4.tar.gz -C /opt/ #…

SpringCloud链路追踪——Spring Cloud Sleuth 和 Zipkin 介绍 Windows 下使用初步

前言 在微服务中&#xff0c;随着服务越来越多&#xff0c;对调用链的分析越来越复杂。如何能够分析调用链&#xff0c;定位微服务中的调用瓶颈&#xff0c;并对其进行解决。 本篇博客介绍springCloud中用到的链路追踪的组件&#xff0c;Spring Cloud Sleuth和Zipkin&#xf…

扩散模型学习

第一章 1.1 的原理 给定一批训练数据X&#xff0c;假设其服从某种复杂的真实 分布p(x)&#xff0c;则给定的训练数据可视为从该分布中采样的观测样本x。 生成模型就是估计训练数据的真实分布&#xff0c;使得估计的分布q(x)和真实分布p(x)差距尽可能能的小。 使得所有训练…

【五:Httprunner的介绍使用】

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

FPGA的音乐彩灯VHDL流水灯LED花样,源码和视频

名称&#xff1a;FPGA的音乐彩灯VHDL流水灯LED 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; &#xff08;1&#xff09;设计一彩灯控制电路&#xff0c;按要求控制8路&#xff08;彩灯由发光 二极管代替&#xff0c;受实验箱限制&#xff0c;多路同…

CUDA 学习记录

1.关于volatile&#xff1a; 对于文章中这个函数&#xff0c; __global__ void reduceUnrollWarps8 (int *g_idata, int *g_odata, unsigned int n) {// set thread IDunsigned int tid threadIdx.x;unsigned int idx blockIdx.x * blockDim.x * 8 threadIdx.x;// convert…

李m圆申论

听话出活 3小时 /处理7500字 /一共5题 /写出2200字 字写得好看点&#xff0c;符号也算字数&#xff0c;占一个格 基本思路&#xff1a;考什么范围答什么 。。。落后&#xff1b;资源闲置、缺乏 申论&#xff1a; 作文题&#xff1a;举例子 处理材料 摘抄&#xff1a; 有人出…

《数据结构、算法与应用C++语言描述》-队列的应用-电路布线问题

《数据结构、算法与应用C语言描述》-队列的应用-电路布线问题 问题描述 在 迷宫老鼠问题中&#xff0c;可以寻找从迷宫入口到迷宫出口的一条最短路径。这种在网格中寻找最短路径的算法有许多应用。例如&#xff0c;在电路布线问题的求解中&#xff0c;一个常用的方法就是在布…

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

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

非平稳信号分析和处理、STFT的瞬时频率研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

高校教务系统登录页面JS分析——华南理工大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

可以更改字体颜色的便签备忘录工具选择用哪个

日常添加笔记记录是一个非常好的习惯&#xff0c;通过笔记来记录一些重要的内容一方面可以帮助大家回顾过去的相关记录&#xff0c;另一方面如果记录的笔记是有关学习类的&#xff0c;还有助于大家随时查看记录的笔记。 多数时候记录笔记内容大家通常会选择一些比较方便易操作…