C# 结构型设计模式----外观模式

ops/2024/11/2 9:48:29/

1、简介

        外观模式,顾名思义肯定是描述外在的一种表现,在人与人之间,外观的好坏体现在各自的长相以及穿着,气质等表现,而在系统设计之间,外观则是表现在系统的接口调用,调用接口的代码越简洁,需要调用的接口越少是不是看起来和用起来更舒服? 

        外观模式的主要作用就是用于当有多个类(或者系统接口)要处理时,需要一个个类(或者子系统接口啥的)去调用,没有复用性和扩展性。外观模式将处理子类(或者子系统接口啥的)的过程封装成操作,简化客户端的调用过程。也将客户端与子类(或者子系统接口啥的)之间解耦。

总结就是:

        外观模式(Facade)通过提供一个统一接口,来访问子系统的多个接口。

  使用外观模式时,创建一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法。

  外观模式让客户端与子系统之间避免紧耦合。

外观模式包含如下两个角色

      (1)、外观角色(Facade):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。

      (2)、子系统角色(SubSystem):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

优点:
           外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
           外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。

缺点:
                如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则(当然可以结合其他设计模式去优化)。

2、适用场景

        1、外一个复杂的子系统提供一个简单的接口
        2、提供子系统的独立性
        3、在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子。

3、实例

假设有这么一个登录流程: 

在用户点击登录后,系统需要从颁发密钥的系统A获取一个Token密钥然后使用密钥到验证码系统B那里去获取用户验证码验证结果,验证通过后再带着账号密码和密钥到身份认证系统C检查账号密码,都正确就成功登录。

下面是三个系统的调用方法:

 /// <summary>/// 系统A-子系统角色(SubSystem)/// </summary>public class SystemA{/// <summary>/// 模拟调用系统A的某个接口/// </summary>public void GetInterface(){Console.WriteLine("调用系统A的获取身份令牌Token的接口");}}/// <summary>/// 系统B-子系统角色(SubSystem)/// </summary>public class SystemB{/// <summary>/// 模拟调用系统B的某个接口/// </summary>public void GetInterface(){Console.WriteLine("调用系统B的获取验证码结果的接口");}}/// <summary>/// 系统C-子系统角色(SubSystem)/// </summary>public class SystemC{/// <summary>/// 模拟调用系统C的某个接口/// </summary>public void GetInterface(){Console.WriteLine("调用系统C的身份信息确认接口");}}

不使用外观模式实现登录

private void WTBtn_Click(object sender, EventArgs e)
{Console.WriteLine("用户输入相关信息后点击登录!");SystemA systemA = new SystemA();systemA.GetInterface();//步骤1SystemB systemB = new SystemB();systemB.GetInterface();//步骤2SystemC systemC = new SystemC();systemC.GetInterface();//步骤3Console.WriteLine("登录成功!");
}

使用外观模式实现登录

创建外观角色(Facade)

/// <summary>
/// 外观角色(Facade)
/// </summary>
public class Facade
{/// <summary>/// 将调用流程集成在这,三个接口变一个接口。/// </summary>public void Iintegrate(){SystemA systemA = new SystemA();systemA.GetInterface();//步骤1SystemB systemB = new SystemB();systemB.GetInterface();//步骤2SystemC systemC = new SystemC();systemC.GetInterface();//步骤3}
}

 调用:

private void WTBtn_Click(object sender, EventArgs e)
{Console.WriteLine("用户输入相关信息后点击登录!");Facade facade=new Facade();facade.Iintegrate();Console.WriteLine("登录成功!");
}

客户端调用是不是变得简单了。

看到这是不是觉得似曾相识?那你不妨将 外观角色(Facade)当作一个接口看待。只不过他是面向系统架构的接口罢了。

END................................................................................................................... 


http://www.ppmy.cn/ops/130389.html

相关文章

ubuntu 异常 断电 日志 查看

sudo less /var/log/syslog 搜 Linux version

Python软体中使用Pandas库读取数据并绘制柱状图的实用指南

Python软体中使用Pandas库读取数据并绘制柱状图的实用指南 在数据分析和可视化的过程中,Python的Pandas库和Matplotlib库是两个不可或缺的工具。Pandas用于数据处理和分析,而Matplotlib则用于数据可视化。本文将详细介绍如何使用Pandas库读取数据,并利用Matplotlib绘制柱状…

Java中的并查集:从基础到高级应用

并查集&#xff08;Disjoint Set&#xff09;是一种用于处理不相交集合的合并及查询问题的数据结构。它在图论、网络通信、动态连通性问题等领域有广泛应用。本文将深入探讨并查集的基本原理、实现方式、优化技巧以及在Java中的应用&#xff0c;并通过实例代码帮助读者更好地理…

SQL 通用数据类型

SQL 通用数据类型 SQL(Structured Query Language)是一种用于管理关系数据库管理系统的标准编程语言。在SQL中,数据类型定义了数据在数据库中的存储方式和使用方式。不同的数据库系统(如MySQL, PostgreSQL, SQL Server等)可能会提供特有的数据类型,但大多数都遵循一些通…

股市修心篇

在股市中,四心诀——明心、发心、问心、归心,是一种心理层面的修炼和决策哲学,帮助投资者在面对市场波动和交易决策时,保持清醒、理性、和自律。以下是对这四心诀的详细解读: 1. 明心:明确自己的投资目标和心态 定义:明心指的是清晰认识自己的投资目标、风险承受能力和…

TTS(Text-to-Speech)和LLM(Large Language Model) 介绍

TTS&#xff08;TexttoSpeech&#xff09;和LLM&#xff08;Large Language Model&#xff09; 是两种不同的技术&#xff0c;尽管它们都与自然语言处理相关&#xff0c;但它们的功能和应用领域有所不同&#xff1a; 1. TexttoSpeech (TTS) TTS 是一种将文本转化为语音的技术&a…

Python爬虫系列(一)

目录 一、urllib 1.1 初体验 1.2 使用urllib下载网页、图片、视频等 1.3 反爬介绍 1.4 请求对象定制 1.5 get请求的quote方法 1.6 多个参数转成ascii编码 1.7 post请求 1.8 综合案例演示 一、urllib 1.1 初体验 # urllib是python默认带的&#xff0c;无需额外下载 i…

电脑软件:推荐一款免费且实用的电脑开关机小工具

目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown&#xff0c;有需要的朋友可以下载试一下&#xff01; 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具&#xff0c;对于…