结构型模式 - 外观模式Facade
1、tm的NT审核机制,满篇文章哪来的广告? 就算有也是你们自己加的吧?等财富能支持我自己的网站后,就是和你们说再见之时。
2、tm第二遍说,我接着提交,这个审核机制的傻逼设计者或者是程序敲出来的bug。
3、广告广告广你老母亲的告? 我都三边发,你倒是告诉我哪里有广告啊
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。
目标
软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。
外观模式的定义与特点
外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
在日常编码工作中,我们都在有意无意的大量使用外观模式。只要是高层模块需要调度多个子系统(2个以上的类对象),我们都会自觉地创建一个新的类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。尤其是现阶段各种第三方SDK、开源类库,很大概率都会使用外观模式。
外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点。
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
- 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
- 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。
外观(Facade)模式的主要缺点如下。
- 不能很好地限制客户使用子系统类,很容易带来未知风险。
- 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
外观模式的结构与实现
外观(Facade)模式的结构比较简单,主要是定义了一个高层接口。它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。现在来分析其基本结构和实现方法。
1. 模式的结构
外观(Facade)模式包含以下主要角色。
- 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
- 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
- 客户(Client)角色:通过一个外观角色访问各个子系统的功能。
其结构图如图 1 所示。
代码
using DesignPattern.FacadePattern;
using System;
namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
FacadeHelper();
}
#region Pattern - Facade
static void FacadeHelper()
{
FacadeMode facade = new FacadeMode();
facade.BackHome();
facade.GoSleep();
facade.GoWork();
Console.ReadLine();
}
#endregion
}
}
//======================================================================================
using System;
namespace DesignPattern.FacadePattern
{
/// <summary>
/// 外观接口
/// </summary>
internal interface IFacade
{
/// <summary>
/// 打开
/// </summary>
void Open();
/// <summary>
/// 关闭
/// </summary>
void Close();
}
/// <summary>
/// 窗户
/// </summary>
public class Window : IFacade
{
public void Close()
{
Console.WriteLine("关闭窗户");
}
public void Open()
{
Console.WriteLine("打开窗户");
}
}
/// <summary>
/// 无线网络
/// </summary>
public class Wifi : IFacade
{
public void Close()
{
Console.WriteLine("关闭Wifi");
}
public void Open()
{
Console.WriteLine("打开Wifi");
}
}
/// <summary>
/// 闹钟
/// </summary>
public class Alarm : IFacade
{
public void Close()
{
Console.WriteLine("关闭闹铃");
}
public void Open()
{
Console.WriteLine("打开闹铃");
}
}
/// <summary>
/// 对外窗口
/// </summary>
public class FacadeMode
{
private Window m_window;
private Wifi m_wifi;
private Alarm m_alarm;
/// <summary>
/// 对外窗口
/// </summary>
public FacadeMode()
{
m_window = new Window();
m_wifi = new Wifi();
m_alarm = new Alarm();
}
/// <summary>
/// 到家
/// </summary>
public void BackHome()
{
Console.WriteLine("Xiaohei is back.");
m_window.Open();
m_wifi.Open();
m_alarm.Close();
}
/// <summary>
/// 该睡觉
/// </summary>
public void GoSleep()
{
Console.WriteLine("Should be sleep.");
m_window.Close();
m_wifi.Close();
m_alarm.Open();
}
/// <summary>
/// 去工作
/// </summary>
public void GoWork()
{
Console.WriteLine("Wow,go to work.");
m_window.Close();
m_wifi.Close();
m_alarm.Close();
}
}
}
与代理模式之间的异同
相同点
- 都可以在不改变子系统代码的基础上,对子系统加以控制。
- 原有系统之间都是可以直接访问的,两个模式都是为了让子系统更加容易使用。
- 都不应该在其中添加子系统没有的功能。
不同点
- 外观模式面向的是多条个不同的子系统,而代理模式通常面向的是一个(或者多个相同的)子系统。
- 外观模式更多强调的是对多个子系统的整合,而代理模式更多强调的是对某个子系统的代理。
极端情况下,例如外观模式中的子系统只有一个,就跟代理模式差不多了,这有点像抽象工厂模式和工厂方法模式之间的关系。
总结:
外观模式其实就象是我们的生活中已经设置好的小爱同学:
- 我到家了,它会帮我开电脑,订好晚上洗漱和该睡觉的闹铃。
- 我说晚安,它会帮我关灯、会设置好2个小时后的关空调、会设置好早晨的起床闹铃,会放半个小时的催眠曲。
- 早晨我让它播放早报,它会同时设置好我下班前半个小时打开空调、会关闭除自身外的电源总控。
这么一说,小爱同学是我生活中不可缺少的一部分啊。
希望大家:点赞,留言,关注咯~
唠家常
今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我QQ:841298494,大家一起进步。
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
今日推荐
结构型模式 - 外观模式Facade的更多相关文章
- 【设计模式】结构型03外观模式(Facade Pattern)
[设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...
- 《精通Python设计模式》学习结构型之外观模式
这个我在工作中也有所应用的. 就是在真正的实现层上面,再封装一个函数的调用的. 这样就可以在内层函数作真正实现, 而外层调用函数对外开放, 隔离内外的变化性. from enum import Enu ...
- 【结构型】Flyweight模式
享元模式的主要目的.意图是为对象的大量使用提供一种共享机制.该模式的思想重在复用.共享复用.像文字.列表中的格子等这类多数都是需要考虑复用技术,否则必将大量耗费内存空间而使资源以及性能等大量耗费.该模 ...
- python设计模式---结构型之代理模式
主要想着nginx:) from abc import ABCMeta, abstractmethod # 结构型设计模式---代理模式 class Actor: def __init__(self) ...
- 设计模式 结构型模式 外观模式(Facade Pattern)
在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“ ...
- java设计模式--结构型模式--外观模式
外观模式 概述 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 1.当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不 ...
- 结构型:代理模式 Vs 适配器模式 Vs 门面模式(外观模式)
先上UML图 代理模式: 适配器模式: 门面模式(外观模式): 打了例子……呃……举个比方 代理模式: 水浒街,西门庆看上潘金莲,想和她嘿咻嘿咻,但是自己有不能去找潘金莲去说,于是他找到了金牌代理人王 ...
- 【设计模式】结构型04桥接模式(Bridge Pattern)
学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...
- JAVA设计模式 5【结构型】代理模式的理解与使用
今天要开始我们结构型 设计模式的学习,设计模式源于生活,还是希望能通过生活中的一些小栗子去理解学习它,而不是为了学习而学习这些东西. 结构型设计模式 结构型设计模式又分为 类 结构型 对象 结构型 前 ...
随机推荐
- 驱动开发:内核LDE64引擎计算汇编长度
本章开始LyShark将介绍如何在内核中实现InlineHook挂钩这门技术,内核挂钩的第一步需要实现一个动态计算汇编指令长度的功能,该功能可以使用LDE64这个反汇编引擎,该引擎小巧简单可以直接在驱 ...
- 介绍一个jmeter录制脚本谷歌插件 —— metersphere-chrome-plugin
该插件可将用户在浏览器操作时的 HTTP 请求记录下来并生成 JMX 文件(JMeter 脚本文件). 1. 插件解压 插件下载链接: https://pan.baidu.com/s/14nGb_s9 ...
- 统一的开发平台.NET 7正式发布
在 2020 年规划的.NET 5功能终于在.NET 7 完成了,为微软和社区一起为多年来将不同的开发产品统一起来的努力加冕,未来只有一个.NET, 回顾.NET 20年,从.NET Framewo ...
- 【OpenStack云平台】网络控制节点 HA 集群配置
个人名片: 因为云计算成为了监控工程师 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 网络控制节点运行在管理网络和数据网络中,如果虚拟机实例要连接到互联网,网络控制节点也需要具备 ...
- 聊聊Go里面的闭包
以前写 Java 的时候,听到前端同学谈论闭包,觉得甚是新奇,后面自己写了一小段时间 JS,虽只学到皮毛,也大概了解到闭包的概念,现在工作常用语言是 Go,很多优雅的代码中总是有闭包的身影,看来不了解 ...
- VS 生成后事件中自动修改文件名插入当前时间
目录 rename 指令 获取当前时间 将当前时间插入名字 rename 指令 VS 生成后事件中使用的是CMD 的语法 我们重命名使用的是Rename 简单用法如下: RENAME (REN) [d ...
- i春秋wanna to see your hat?
打开题目网页发现是个选择帽子的网页,点击超链接进入一个网页让我们输入我们的name然后匹配帽子颜色(其实不管怎么填都是绿色的)这里也有个注册窗口 先查看源码没什么特别发现,再试试抓包吧 在这个界面抓包 ...
- 大前端html基础学习01
根目录 相对路径:针对图片数量比较多的情况,新建一个文件夹,将所有图片放进去,imgs/cat.webp (1)/:下一级 (2)a/b/c/cat.webp 返回路径(向外找):从下一级html中找 ...
- JAVA-面向对象之对象拷贝
Java 中的数据类型分为基本数据类型和引用数据类型.对于这两种数据类型,在进行赋值操作.用作方法参数或返回值时,会有值传递和引用(地址)传递的差别. Map对象 测试01-等号赋值: @Test p ...
- SUPERVISOR监控tomcat配置文件
Supervisor安装教程参考:https://www.cnblogs.com/brad93/p/16639953.html tomcat安装教程参考:https://www.cnblogs.com ...