1、tm的NT审核机制,满篇文章哪来的广告? 就算有也是你们自己加的吧?等财富能支持我自己的网站后,就是和你们说再见之时。
2、tm第二遍说,我接着提交,这个审核机制的傻逼设计者或者是程序敲出来的bug。
3、广告广告广你老母亲的告?   我都三边发,你倒是告诉我哪里有广告啊

学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

目标

软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

外观模式的定义与特点

外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

在日常编码工作中,我们都在有意无意的大量使用外观模式。只要是高层模块需要调度多个子系统(2个以上的类对象),我们都会自觉地创建一个新的类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。尤其是现阶段各种第三方SDK、开源类库,很大概率都会使用外观模式。

外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点。

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
  • 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

外观(Facade)模式的主要缺点如下。

  • 不能很好地限制客户使用子系统类,很容易带来未知风险。
  • 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

外观模式的结构与实现

  外观(Facade)模式的结构比较简单,主要是定义了一个高层接口。它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。现在来分析其基本结构和实现方法。

1. 模式的结构

外观(Facade)模式包含以下主要角色。

  1. 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
  2. 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
  3. 客户(Client)角色:通过一个外观角色访问各个子系统的功能。

其结构图如图 1 所示。

图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();
}
}
}

运行结果

与代理模式之间的异同

相同点

  • 都可以在不改变子系统代码的基础上,对子系统加以控制。
  • 原有系统之间都是可以直接访问的,两个模式都是为了让子系统更加容易使用。
  • 都不应该在其中添加子系统没有的功能。

不同点

  • 外观模式面向的是多条个不同的子系统,而代理模式通常面向的是一个(或者多个相同的)子系统。
  • 外观模式更多强调的是对多个子系统的整合,而代理模式更多强调的是对某个子系统的代理。

极端情况下,例如外观模式中的子系统只有一个,就跟代理模式差不多了,这有点像抽象工厂模式和工厂方法模式之间的关系。

总结:

 外观模式其实就象是我们的生活中已经设置好的小爱同学:

  1. 我到家了,它会帮我开电脑,订好晚上洗漱和该睡觉的闹铃。
  2. 我说晚安,它会帮我关灯、会设置好2个小时后的关空调、会设置好早晨的起床闹铃,会放半个小时的催眠曲。
  3. 早晨我让它播放早报,它会同时设置好我下班前半个小时打开空调、会关闭除自身外的电源总控。

这么一说,小爱同学是我生活中不可缺少的一部分啊。


希望大家:点赞,留言,关注咯~

唠家常

今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们

今日推荐

结构型模式 - 外观模式Facade的更多相关文章

  1. 【设计模式】结构型03外观模式(Facade Pattern)

    [设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...

  2. 《精通Python设计模式》学习结构型之外观模式

    这个我在工作中也有所应用的. 就是在真正的实现层上面,再封装一个函数的调用的. 这样就可以在内层函数作真正实现, 而外层调用函数对外开放, 隔离内外的变化性. from enum import Enu ...

  3. 【结构型】Flyweight模式

    享元模式的主要目的.意图是为对象的大量使用提供一种共享机制.该模式的思想重在复用.共享复用.像文字.列表中的格子等这类多数都是需要考虑复用技术,否则必将大量耗费内存空间而使资源以及性能等大量耗费.该模 ...

  4. python设计模式---结构型之代理模式

    主要想着nginx:) from abc import ABCMeta, abstractmethod # 结构型设计模式---代理模式 class Actor: def __init__(self) ...

  5. 设计模式 结构型模式 外观模式(Facade Pattern)

    在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“ ...

  6. java设计模式--结构型模式--外观模式

    外观模式 概述 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 1.当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不 ...

  7. 结构型:代理模式 Vs 适配器模式 Vs 门面模式(外观模式)

    先上UML图 代理模式: 适配器模式: 门面模式(外观模式): 打了例子……呃……举个比方 代理模式: 水浒街,西门庆看上潘金莲,想和她嘿咻嘿咻,但是自己有不能去找潘金莲去说,于是他找到了金牌代理人王 ...

  8. 【设计模式】结构型04桥接模式(Bridge Pattern)

    学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...

  9. JAVA设计模式 5【结构型】代理模式的理解与使用

    今天要开始我们结构型 设计模式的学习,设计模式源于生活,还是希望能通过生活中的一些小栗子去理解学习它,而不是为了学习而学习这些东西. 结构型设计模式 结构型设计模式又分为 类 结构型 对象 结构型 前 ...

随机推荐

  1. Java中math类的常用函数

    Java中math类的常用函数 在 Java 中 Math 类封装了常用的数学运算,提供了基本的数学操作,如指数.对数.平方根和三角函数等 只要在源文件的顶部加上下面这行代码就不必在数学方法名和常量名 ...

  2. element-plus 消息提示

    用来显示「成功.警告.消息.错误」类的操作 <template> <el-button :plain="true" @click="open2" ...

  3. pinpoint:查看hbase表和修改数据过期时间

    先做个记录,监控数据量过大时可以设置表的数据过期时间来清理数据. 1. 查找本地数据表大小 [root@ZWZF-CWY-LZY-12 ~]# cd /home/pinpoint/hbase/data ...

  4. 用map来统计数组中各个字符串的数量

    1.背景 想要统计这一个字符串数组中每一个非重复字符串的数量,使用map来保存其key和value.这个需求在实际开发中经常使用到,我以前总是新建一个空数组来记录不重复字符串,并使用计数器计数,效率低 ...

  5. SpringBoot yml配置文件中,logging.level报错

    报错 *************************** APPLICATION FAILED TO START *************************** Description: ...

  6. netty系列之:在netty中使用proxy protocol

    目录 简介 netty对proxy protocol协议的支持 HAProxyMessage的编码解码器 netty中proxy protocol的代码示例 总结 简介 我们知道proxy proto ...

  7. 正则表达式之前戏、字符组、量词、特殊符号、贪婪与非贪婪匹配等,python正则模块之re

    目录 正则表达式前戏 正则表达式之字符组 正则表达式之特殊符号 正则表达式之量词 贪婪匹配与非贪婪匹配 转义符 正则表达式实战建议 re模块 re模块补充说明 作业 正则表达式前戏 案例:京东注册手机 ...

  8. 如何在kali Linux上安装VMware Tools

    作用: 1.让虚拟机和本地上的文件可以互传,直接拖动就可以实现转接 2.可在虚拟机上执行本地脚本 3.本地时钟与虚拟机同步 4........... 方法: 1.运行虚拟机 2.在上方菜单栏中点击安装 ...

  9. 大前端系统学-了解html

    标签: 使用尖括号包起来的就是标签,例如我们看到的  <html></html> 一对标签 <head>  开始标签 </head> 结束标签 < ...

  10. go get 报错:dial tcp 142.251.43.17:443: i/o timeout

    自动下载 go env -w GO111MODULE=on 设置环境为国内代理 go env -w GOPROXY=https://goproxy.cn,direct 注:go 版本需要支持 mod