C#设计模式10——外观模式的写法
什么是外观模式?
外观模式(Facade Pattern)又称门面模式,是一种结构型设计模式,它提供了一个统一的接口,用来访问一个子系统中一群功能相关联的接口。外观模式定义了一个高层接口,让子系统更容易使用。
为什么要使用外观模式?
在一个大型系统中,有时候可能会存在大量的复杂的子系统,它们之间的关系错综复杂,对客户端来说直接访问会非常困难,甚至不可行。而外观模式可以为客户端提供一个简单的接口,帮助客户端访问这些子系统,从而降低了复杂度,提高了可维护性和可扩展性。
外观模式的优点有哪些?
1. 简化了客户端与子系统之间的交互,客户端只需要调用一个简单的接口即可完成操作。
2. 将复杂的子系统封装起来,对客户端隐藏了系统的复杂性,提高了可维护性和可扩展性。
3. 降低了客户端与子系统的耦合度,使得子系统的变化对客户端的影响降到最低。
如何使用外观模式?
外观模式包含以下几个角色:
1. Facade(门面):提供了一个统一的接口,用来访问子系统中一群功能相关联的接口。
2. Subsystem classes(子系统类):实现了子系统的功能,处理由Facade对象指派的任务。
3. Client(客户端):通过门面访问子系统的功能。
在使用外观模式时,首先需要定义好Facade接口,然后按需调用子系统类来实现这个接口,并作为外界的统一接口提供给客户端调用。客户端只需要调用Facade接口,即可完成与子系统的交互。
何时使用外观模式?
在以下情况下,可以考虑使用外观模式:
1. 需要简化客户端与复杂子系统之间的交互,提高交互效率。
2. 有多个子系统之间互相交互且关系复杂,需要对它们进行统一管理。
3. 为了降低系统中模块间的耦合度,需要引入一个中间层来进行解耦。
4. 需要提高系统的可维护性和可扩展性,以方便后期的维护和拓展。
下面我们来看一个简单的C#外观模式的示例代码:
首先我们需要定义一个门面接口:
public interface IShapeFacade
{
void DrawCircle();
void DrawRectangle();
void DrawTriangle();
}
然后我们定义三个子系统类,它们实现了门面接口:
public class Circle : IShapeFacade
{
public void DrawCircle()
{
Console.WriteLine("Drawing a circle...");
}
public void DrawRectangle()
{
//空实现
}
public void DrawTriangle()
{
//空实现
}
}
public class Rectangle : IShapeFacade
{
public void DrawCircle()
{
//空实现
}
public void DrawRectangle()
{
Console.WriteLine("Drawing a rectangle...");
}
public void DrawTriangle()
{
//空实现
}
}
public class Triangle : IShapeFacade
{
public void DrawCircle()
{
//空实现
}
public void DrawRectangle()
{
//空实现
}
public void DrawTriangle()
{
Console.WriteLine("Drawing a triangle...");
}
}
最后,我们定义一个门面类,它包含了三个子系统类的实例,并将它们的方法封装在一个方法中实现:
public class ShapeMaker : IShapeFacade
{
private Circle circle;
private Rectangle rectangle;
private Triangle triangle;
public ShapeMaker()
{
circle = new Circle();
rectangle = new Rectangle();
triangle = new Triangle();
}
public void DrawCircle()
{
circle.DrawCircle();
}
public void DrawRectangle()
{
rectangle.DrawRectangle();
}
public void DrawTriangle()
{
triangle.DrawTriangle();
}
}
在客户端代码中,我们只需要创建一个ShapeMaker对象,并调用它的DrawCircle、DrawRectangle和DrawTriangle方法即可:
代码运行结果如下:
Drawing a circle...
Drawing a rectangle...
Drawing a triangle...
这样,在客户端中,我们只需要和门面类ShapeMaker进行交互,而无需知道子系统类的具体实现。这个示例虽然非常简单,但它很好地演示了外观模式的特点和作用。
C#设计模式10——外观模式的写法的更多相关文章
- [设计模式] 10 外观模式 facade
外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构. ...
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
- C#设计模式(11)——外观模式(Facade Pattern)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式之 外观模式详解(Service第三者插足,让action与dao分手)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,LZ今天给各位分享一 ...
- 8.4 GOF设计模式三: 外观模式 Facade
GOF设计模式三: 外观模式 Facade “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...
- 北风设计模式课程---外观模式(Facade)总结
北风设计模式课程---外观模式(Facade)总结 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装备 ...
- js设计模式——2.外观模式
js设计模式——2.外观模式
- python设计模式之外观模式
python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...
- C#设计模式学习笔记:(10)外观模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7772184.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第五个模式--外 ...
随机推荐
- PolarCTF-2023冬季个人挑战赛 WP
Crypto 数星星 题目 小明暗恋小红很久了,终于在一个月黑风高的夜晚,决定约她出去数星星.小明数着数着,数出了一串数字,3,6,10,12,15,他觉得这是爱情的关键,思考了整整一晚上,小红很生气 ...
- Spring系列:基于Spring-AOP和Spring-Aspects实现AOP切面编程
目录 一.概念及相关术语 概念 相关术语 ①横切关注点 ②通知(增强) ③切面 ④目标 ⑤代理 ⑥连接点 ⑦切入点 作用 二.基于注解的AOP 技术说明 准备工作 创建切面类并配置 各种通知 切入点表 ...
- C++ 核心指南 —— 性能
C++ 核心指南 -- 性能 阅读建议:先阅读 <性能优化的一般策略及方法> 截至目前,C++ Core Guidelines 中关于性能优化的建议共有 18 条,而其中很大一部分是告诫你 ...
- 数字孪生结合GIS系统为物流行业带来的改变
随着全球物流业务不断扩张和发展,数字化转型成为当今物流行业的主要趋势.在这个数字化时代,数字孪生技术和地理信息系统(GIS)的结合,为物流行业带来了前所未有的机遇和挑战.这种融合将为物流企业提供更高效 ...
- Spring Batch 的基本使用
简介 A lightweight, comprehensive batch framework designed to enable the development of robust batch a ...
- 介绍一个prometheus监控数据生成工具
prometheus-data-generator Prometheus数据模拟工具旨在通过配置文件模拟Prometheus数据,用于测试和开发目的.该工具允许您生成用于测试和开发的合成数据. 配置 ...
- 未经授权访问 .js
流程顺序:后台管理登陆地址 → 后台主页地址 → fuzz测试出用户管理列表接口 → 直接调接口..全程黑盒. 那么接下来我逆着来推理下逻辑: 首先是拿到某后台管理登录的网址 接着查看html源码,发 ...
- Java异常处理之数字溢出问题
在进行 Java 开发时,经常会遇到数字溢出的问题.这个问题在很多程序中都非常常见,尤其是在进行数值计算的时候.Java 中提供了一种异常机制来处理这种情况,我们可以在代码中使用 try-catch ...
- [Python急救站]学生管理系统链接数据库
相信很多人在初学Python的时候,经常最后作业就是完成一个学生管理系统,但是我们来做一个完美的学生管理系统,并且将数据储存到数据库里. 我们先看看我们的数据库怎么设置. 首先呢,我选择用的是SQL ...
- LeetCode 哈希表、映射、集合篇(242、49)
242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = " ...