C# 外观模式

news2024/11/15 2:16:46

概述

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端可以通过简单的接口与子系统进行交互。

外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。

外观模式中的角色:

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

2 子系统类集合(SubSystem Classes):子系统类集合实现了子系统的功能,处理外观类对象指派的任务。

外观模式的优缺点:

优点:

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

缺点:

如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。

结构图如下:

代码

新建一个控制台项目,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 外观模式
{
    // 客户端代码
    class Client
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();
            facade.Operation();

            Console.ReadKey();
        }
    }

    // 外观类
    class Facade
    {
        private SubsystemA subsystemA;
        private SubsystemB subsystemB;

        public Facade()
        {
            subsystemA = new SubsystemA();
            subsystemB = new SubsystemB();
        }

        public void Operation()
        {
            subsystemA.OperationA();
            subsystemB.OperationB();
        }
    }

    // 子系统类A
    class SubsystemA
    {
        public void OperationA()
        {
            Console.WriteLine("SubsystemA: OperationA");
        }
    }

    // 子系统类B
    class SubsystemB
    {
        public void OperationB()
        {
            Console.WriteLine("SubsystemB: OperationB");
        }
    }
}

运行:

从上面的代码来看,外观模式实现起来也非常的简单,只是将两个子系统放到一个类中实例化,在其他类调用就好了。

那就随便写一个案例吧,一个屋主,养了两条狗,有一天在家里,突然发现院子里有个小偷,于是屋主就开门放狗,咬向了两个小偷,就用外观模式来实现这个功能。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 外观模式
{
    internal class Program
    {
        static void Main(string[] args)
        {
            People.SeeingThief();

            Console.ReadKey();
        }
    }

    public class Dog
    {
        //名字
        public string Name { get; set; }
        //种类
        public string Types { get; set; }

        public virtual void Bite() { }
    }

    public class DogA : Dog
    {
        public override void Bite()
        {
            Console.WriteLine("{0}{1} 狂吠不止,向门外冲去",Types, Name);
        }
    }

    public class DogB : Dog
    {
        public override void Bite()
        {
            Console.WriteLine("{0}{1} 张开血盆大口,一跃而起", Types, Name);
        }
    }

    public class Home
    {
        public DogA dogA;
        public DogB dogB;

        public void OpenTheDoor()
        {
            dogA.Bite();
            dogB.Bite();
        }

        public Home()
        {
            dogA = new DogA() { Name = "大黄", Types = "土狗" };
            dogB = new DogB() { Name = "黑背", Types = "德牧" };
        }
    }

    public class People
    {
        //看见小偷
        public static void SeeingThief()
        {
            Console.WriteLine("屋主:哇!有小偷!!!");
            Console.WriteLine("屋主:开门放狗");
            Home home = new Home();
            home.OpenTheDoor();          
        }

        private People() { }
    }
}

运行:

这个多态感觉没用上,在外观模式中,本来也没有用到多态,就这样吧。 

end

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

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

相关文章

计算机体系结构知识点大全

计算机体系结构知识点大全 计算机体系结构Chapter-1:计算机系统结构的基本概念Chapter-2:指令系统Chapter-3:流水线技术Chapter-4:存储层次Chapter-5:输入输出系统Chapter-6:多处理机Chapter-7:…

EXCEL,查询多条件数字/文本内容的多方法总结

目录 1 问题:如何根据多条件查询到想要的内容 2 方法1: sumif() 和sumifs() 只适合查找数字,不适合查找文本字符串类型的内容 3 使用lookup(1,0/(条件1*条件2*....),结果查询区域) 的方法 4 vlookup()if()数组公式 5 使用 index()match…

STM32按键控制LED灯-HAL库

前言 空窗了一年,重头再来点个灯吧,本篇文章将主要给大家讲解按键点灯 一、原理图设计 LED0-LED2 --------> PA0-PA2引脚 KEY1 ---------> PA3引脚 二、CubeMX的设置 LED选择GPIO一次将PA0、PA1、PA2设置为GPIO_Output,输出电平为…

向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录

1、注册https://issues.sonatype.org/账号 下面就代表注册好了,同时提交的工单也通过了 2、这里主要是goupId 需要进行认证,需要到域名注册商近一个txt的解析,以便确保这个是你的 通过下面来验证你的域名信息,这里主要是上面的工…

Permute 3 for mac音视频格式转换

Permute是一款Mac平台上的媒体格式转换软件,由Chaotic Software开发。它可以帮助用户快速地将各种音频、视频和图像文件转换成所需格式,并提供了一些常用工具以便于用户进行编辑和处理。 Permute的主要特点包括: - 支持大量格式:支…

工程监测仪器振弦传感器信号转换器(VTI104_DIN)

工程监测仪器振弦传感器信号转换器(VTI104_DIN) 振弦传感器信号转换器,简称VTI104_DIN,是一种用于转换振弦传感器信号的电子设备。该设备可以将振弦传感器产生的模拟信号转换成标准的电压或电流输出,从而使其可以连接…

将网盘挂载到本地保姆级教程

视频链接:https://www.bilibili.com/video/BV1SA411B7qc Clouddrive2:是一款非常实用的国内网盘服务挂载应用。它支持多种国内知名网盘服务,包括阿里云盘、115云盘、天翼云盘等。通过CloudDrive 2,你可以将这些网盘服务挂载到你的…

中级课程——弱口令(认证崩溃)

文章目录 什么是弱口令密码生成器分类暴力破解万能密码测试环境工具 什么是弱口令 密码生成器 分类 暴力破解 万能密码 or true --测试环境 工具 九头蛇,超级弱口令爆破工具,bp,

Redis的键空间监听功能

文章目录 Redis 键空间通知一、keyspace介绍二、事件通知配置三、不同命令生成的事件四、客户端测试五、Springboot整合Redis键空间监听5.1 方式一5.2 方式二 Redis 键空间通知 一、keyspace介绍 keyspace(键空间通知)针对指定key发生的一切改动&#…

香港三维模型:基于GIS数据的精确三维城市模型及其周边2023年

基于GIS数据的精确三维城市模型及其周边2023年 包含的文件: 满城:15公里 信息: 仅在影院4D中设置基本卫星纹理 包含卫星/地图纹理 影院制作4d,可在标准渲染器中进行渲染 漫步建筑、树木(mograph cloner&#xff…

【无标题】JSP--Java的服务器页面

jsp是什么? jsp的全称是Java server pages,翻译过来就是java的服务器页面。 jsp有什么作用? jsp的主要作用是代替Servlet程序回传html页面的数据,因为Servlet程序回传html页面数据是一件非常繁琐的事情,开发成本和维护成本都非常高…

虹科活动 | 走进宇通客车-汽车新供应链技术展精彩回顾

引言 7月27日,走进宇通客车-汽车新供应链技术展于宇通研发中心成功举办,本次展会中虹科为大家带来了一体化车载天线与车辆GNSS仿真测试方案,感谢您前来探讨与交流! 精彩产品一览 车辆GNSS仿真测试方案 虹科高性能GNSS模拟器具有灵…

【二叉树进阶】二叉树经典面试题——最近公共祖先问题

文章目录 1. 二叉树的最近公共祖先1.1 思路1(转换为链表相交问题)1.2 链表相交问题讲解1.3 思路21.4 思路2AC代码 2. 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先2.1 思路分析2.2 AC代码 3. 普通二叉树求最近公共祖先的优化-转化为路径相交的问题3.1 思…

国产DSP,C2000,QX320F280049,打破TI垄断,支持国产

数字电源,光伏逆变器,微电机,充电桩,家电,机器人专用

Python绘图坐标系映射,对数坐标系

文章目录 对数坐标系自定义映射对数坐标图 对数坐标系 在实际绘图时,如果 x , y x,y x,y这两轴的数据变化速率相差过多,线性的坐标映射将无法展示图形变化的细节,就需要更改坐标系的数字映射逻辑,以获得更具细节的图像。 在matp…

【华为HCIP | 高级网络工程师】刷题日记(11)

个人名片: 🐼作者简介:一名大二在校生,喜欢编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:见文末 🕊️系列专栏:🖼️ 零…

pycharm bash: 第 0 行: cd: xxxxxxx: 没有那个文件或目录

设置里面的python接口,path mappings 是空的,设置好本地机器和远程机器所对应的目录就好了。如下图:

【100天精通python】Day23:正则表达式,基本语法与re模块详解示例

目录 专栏导读 1 正则表达式概述 2 正则表达式语法 2.1 正则表达式语法元素 2.2 正则表达式的分组操作 3 re 模块详解与示例 4 正则表达式修饰符 专栏导读 专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html 1 正则表达式概述 python 的…

24考研数据结构-第四章:串

目录 第四章:串4.1串的定义和实现4.1.1串的定义4.1.2串的基本操作字符集编码 4.1.3串的存储结构1. 定长顺序存储表示基本操作实现(基于方案四) 2. 堆分配存储表示3. 串的链式存储结合链表思考优缺点 知识回顾 4.2串的模式匹配4.2.1朴素模式匹…

ChatGPT辅助写论文:提升效率与创造力的利器

写作是人类最重要的交流方式之一,也是学术研究中不可或缺的环节。然而,写作并不是一件容易的事情,尤其是对于科研人员来说,他们需要花费大量的时间和精力来撰写高质量的论文,并且面临着各种各样的挑战,如语…