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. 精简docker的导出镜像

    Docker 镜像是由多个文件系统(只读层)叠加而成,每个层仅包含了前一层的差异部分.当我们启动一个容器的时候,Docker 会加载镜像层并在其上添加一个可写层.容器上所做的任何更改,譬如新建文件.更 ...

  2. 如何通过free看懂内存的真实使用

    之前有位同事问过Linux系统内存free命令下各参数的区别与关系,自己也没太明白,有点尴尬.今天整理一下,供了解. free命令是Liunx操作系统中对内存进行查看和监控的一个常用命令.我们可以直接 ...

  3. 小巧快速的ZooKeeper可视化管理+实时监控工具

    Zookeeper: 是一个分布式的.开源的程序协调服务,是 hadoop 项目下的一个子项目.他提供的主要功 能包括:配置管理.名字服务.分布式锁.集群管理. 平时用zkCli.sh进行管理不免有点 ...

  4. Latex数学公式学习

    要想博客写的更详细,更好,那么具体详细的数学推导这一部分是少不了的,不仅要好看还要方便输入那些更为复杂的符号,因此学习Latex就是必不可少的啦,说不定过几天就要用嘞! 本篇文章参考自超详细 LaTe ...

  5. Dockerfile 跨阶段多阶段使用 ARG 命令

    若要想 Dockerfile 的 ARG 命令可以跨多个阶段使用,需要有以下几步: 先在文件最前面使用 ARG 命令定义 然后在每个阶段分别引用 ARG 命令使用 一个示范的 Dockerfile 文 ...

  6. 重学c#系列——动态类型[二十二]

    前言 该系列准备继续完善,一共108篇,持续更新. 正文 为什么有动态类型呢? 是因为很多东西天生就是动态类型的. 比如xml 和 json.cvs.数据库表,这些本来就是数据类型的. 在反射系列中提 ...

  7. 快速构建页面结构的 3D Visualization

    对 Chrome 扩展功能熟悉的小伙伴,可能都有用过 Chrome 的 3D 展示页面层级关系这个功能. 可以通过 控制台 --> 右边的三个小点 --> More Tools --> ...

  8. 基于Spring-AOP的自定义分片工具

    作者:陈昌浩 1 背景 随着数据量的增长,发现系统在与其他系统交互时,批量接口会出现超时现象,发现原批量接口在实现时,没有做分片处理,当数据过大时或超过其他系统阈值时,就会出现错误.由于与其他系统交互 ...

  9. python3爬取CSDN个人所有文章列表页

    前言 我之前写了下载单篇文章的接口函数,结合这篇写的,就可以下载所有个人的所有文章了 代码实现 没什么技术含量就是简单的 xpath 处理,不过有意思的是有一位csdn 员工将自己的博客地址写到源码里 ...

  10. Java 中你绝对没用过的一个关键字?

    layout: post categories: Java title: Java 中你绝对没用过的一个关键字? tagline: by 子悠 tags: 子悠 前面的文章给大家介绍了如何自定义一个不 ...