〇、简介

1、什么是外观模式?

一句话解释:

  将一系列需要一起进行的操作,封装到一个类中,通过对某一个方法的调用,自动完成一系列操作。

外观模式是一种简单而又实用的设计模式,它的目的是提供一个统一的接口,使得客户端可以通过这个接口来访问子系统中的一组接口,而无需关心子系统中接口的具体实现。外观模式将子系统中的接口封装在一个外观类中,使得子系统的内部细节对客户端隐藏起来。

官方意图描述:为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

一个比喻:(课表与调休日)

  加入今天是周六需要补国庆放假周一的课,那么只需要公告一下,今天按周一的课表上课就行了,不需要逐一通知课表上的任课老师。此时‘周一的课’就是一个封装后的方法,调了这个方法后,就无需再调用每节课的任课老师,课表会进行一一对应。

2、外观模式的优缺点和适用场景

优点:

  • 提供了一个统一的接口:外观模式提供了一个统一的接口,使得客户端可以通过这个接口来访问子系统中的一组接口,而无需关心子系统中接口的具体实现。这样可以使得代码更容易理解和维护。
  • 隐藏子系统的复杂性:外观类将子系统的功能封装起来,客户端只需要调用外观类的方法即可完成操作,从而隐藏了子系统的复杂性。
  • 提高了代码的可扩展性:外观模式提供了一个统一的接口,使得客户端可以通过这个接口来访问子系统中的一组接口,而无需关心子系统中接口的具体实现。这样可以使得代码更容易扩展,当需要添加新的子系统时,只需要添加一个新的外观类即可。

缺点:

  • 增加了系统的复杂性:外观模式引入了外观类和子系统之间的依赖关系,使得系统的结构和实现变得更加复杂。
  • 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则:因此,在设计外观类时,需要考虑到将来可能会增加新的子系统,使得外观类的源代码可以容易地扩展。
  • 可能增加系统的耦合度:外观类和子系统之间的依赖关系可能会导致系统的耦合度增加,从而影响系统的可维护性和可测试性。
  • 可能降低系统的灵活性:由于外观类将子系统的功能封装起来,因此可能会限制客户端对子系统的定制和扩展。

适用场景:

  • 子系统复杂:当子系统的调用接口非常复杂时,可以使用外观模式来简化客户端与子系统之间的交互。
  • 层次复杂:当系统结构层次复杂时,每个层级都一个使用外观对象作为该层入口,可以简化层次间的调用接口。
  • 需要隐藏子系统的细节:当子系统的实现细节不应该被客户端直接访问时,可以使用外观模式来隐藏这些细节。
  • 需要降低耦合度:当客户端和子系统之间的耦合度太高时,可以使用外观模式来降低它们之间的耦合度。

一、外观模式的代码实现

下面是一个关于家庭影院HomeTheaterFacade的示例代码,假设整个影院由四部分(媒体播放器、低音炮、扬声器、遥控)组成,然后通过家庭影院类,将子系统的开关集成到一起,最终实现一键播放和关机:

// 测试一下
class Program
{
static void Main(string[] args)
{
HomeTheaterFacade homeTheaterFacade=new HomeTheaterFacade();
homeTheaterFacade.PlayMovie();
homeTheaterFacade.StopMovie();
Console.ReadLine();
}
}
public class HomeTheaterFacade // 家庭影院外观
{
private MediaPlayer mp; // 媒体播放机
private Subwoofer subwoofer; // 低音炮
private Amplifier amplifier; // 扬声器
private RemoteControl remoteControl; // 无线遥控
public HomeTheaterFacade()
{
mp = new MediaPlayer();
subwoofer = new Subwoofer();
amplifier = new Amplifier();
remoteControl = new RemoteControl();
}
public void PlayMovie()
{
mp.Open();
subwoofer.PowerOn();
amplifier.PowerOn();
remoteControl.Play();
}
public void StopMovie()
{
remoteControl.Stop();
amplifier.PowerOff();
subwoofer.PowerOff();
mp.Close();
}
}
public class MediaPlayer
{
public void Open()
{
Console.WriteLine("Opening the movie...");
}
public void Close()
{
Console.WriteLine("Closing the movie...");
}
}
public class Subwoofer
{
public void PowerOn()
{
Console.WriteLine("Powering on the subwoofer...");
}
public void PowerOff()
{
Console.WriteLine("Powering off the subwoofer...");
}
}
public class Amplifier
{
public void PowerOn()
{
Console.WriteLine("Powering on the amplifier...");
}
public void PowerOff()
{
Console.WriteLine("Powering off the amplifier...");
}
}
public class RemoteControl
{
public void Play()
{
Console.WriteLine("Playing the movie...");
}
public void Stop()
{
Console.WriteLine("Stopping the movie...");
}
}

后续如果又想添加灯光效果,那可以再新增一个类,然后把开关也加在PlayMovie()StopMovie()两方法中即可。

二、结构

由上一章节的代码可类比出外观模式的结构:

Facade(HomeTheaterFacade):

  Facade 知道哪些子系统类负责处理请求,还可将客户的请求代理给适当的子系统对象。

SubsystemClasses 子系统类(MediaPlayer、Subwoofer、Amplifier、RemoteControl):

  包含子系统功能实现;处理由 Facade 对象指派的任务;没有 Facade 的任何相关信息,即没有指向 Facade 的指针。

三、相关模式

Abstract Factory 模式可以与 Facade 模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。Abstract Factory 也可以代替 Facade 模式隐藏那些与平台相关的类。

Mediator 模式与 Facade 模式的相似之处是,它抽象了一些已有的类的功能。然而,Mediator 的目的是对同类之间的任意通信进行抽象,通常集中不属于任何单个对象的功能。Mediator 的同类对象知道中介者并与它通信,而不是直接与其他同类对象通信。相对而言 Facade 模式仅对子系统对象的接口进行抽象,从而使它们更容易使用;它并不定义新功能,子系统也不知道 Facade 的存在。

通常来讲,仅需要一个 Facade 对象,因此 Facade 对象通常属于 Singleton 模式。

Facade 外观模式简介与 C# 示例【结构型5】【设计模式来了_10】的更多相关文章

  1. (转载)设计模式学习笔记(十一)——Facade外观模式

    (转载)http://www.cnblogs.com/kid-li/archive/2006/07/10/446904.html Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户 ...

  2. 设计模式10: Facade 外观模式(结构型模式)

    Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...

  3. Facade——外观模式

    Facade外观模式,也是比较常用的一种模式,基本上所有软件系统中都会用到. GOF 在<设计模式>一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一 ...

  4. C#设计模式之十三代理模式(Proxy)【结构型】

    一.引言   今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字 ...

  5. C#设计模式之八桥接模式(Bridge)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的.因为桥在我们现实 ...

  6. C#设计模式之十组合模式(Composite)【结构型】

    一.引言   今天我们要讲[结构型]设计模式的第四个模式,该模式是[组合模式],英文名称是:Composite Pattern.当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达 ...

  7. C#设计模式之十二享元模式(Flyweight)【结构型】

    一.引言   今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看."享元"是不是可以这样 ...

  8. 设计模式(10)--Facade(外观模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使 ...

  9. 设计模式(十一):FACADE外观模式 -- 结构型模式

    1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...

  10. java演示facade(外观)模式

    实际应用中,原来的代码涉及多个子系统时,重新进行类的设计,将原来分散在源码中的类结构及方法重新组合,形成新的.统一的接口,供上层应用使用. Facade所面对的往往是多个类或其它程序单元,通过重新组合 ...

随机推荐

  1. python开发之远程开发工具对比

    前言 除了本地开发外,还有一种常见的开发方式就是远程开发,一般情况是一台Windows或mac笔记本作为日常使用的电脑,另有一台linux服务器作为开发服务器.开发服务器的性能往往较强,这样远程开发的 ...

  2. opensbi入门

    OpenSBI 入门 声明 本文为本人原创,未经允许,严禁转载. FW_JUMP FW_PAYLOAD FW_DYNAMIC FW_JUMP OpenSBI 带跳转地址的固件(FW_JUMP)是一种仅 ...

  3. Linux安装与配置FTP服务

    1.FTP安装与配置 1.1.FTP安装 一般使用yum直接在线安装 # 在线安装FTP yum install -y vsftpd 安装完成后查看ftp状态 # 查看ftp状态 systemctl ...

  4. 文心一言 VS 讯飞星火 VS chatgpt (66)-- 算法导论6.5 5题

    五.试分析在使用下列循环不变量时,HEAP-INCREASE-KEY 的正确性:在算法的第4~6行 while循环每次迭代开始的时候,子数组 A[1..A.heap-size]要满足最大堆的性质.如果 ...

  5. redis 中的 set

    set是String中的无序集合  底层是 是 value为null 的hash表  时间复杂化是o(1): sadd  k1 v1 v2 v3  set中添加数据 smembers k1 取出set ...

  6. 日志监控平台搭建(Loki+promtail+grafana)

    搭建Loki+promtail+grafana日志监控平台,可以直接在grafana的UI界面查看系统应用日志,使日志查看起来更方便.快捷.   Loki:主服务器,负责存储日志和处理查询. Prom ...

  7. nflsoj 5926 素数环

    题目非常简单,只需要判断相邻两个数的和是不是素数,素数的判断参考数论 不过要注意的一点是题目说的是一个环,所以首尾两个数的和也要是素数 我在输出的时候加上了 is_prime(path[n-1]+1) ...

  8. 知识图谱(Knowledge Graph)- Neo4j 5.10.0 CentOS 安装

    知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装 知识图谱(Knowledge Graph)- Neo4j 5.10.0 CentOS 安装 https:// ...

  9. Spring HandlerInterceptor工作机制

    本文以一个通过正常注册拦截器流程注册拦截器失败的实际场景,来带领大家阅读源码,体会Spring的HandlerInterceptor拦截器整个工作流程 简单认识 org.springframework ...

  10. Redis系列21:缓存与数据库的数据一致性讨论

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...