当前位置: 首页 > news >正文

设计模式学习笔记--Façade外观模式

Façade外观模式:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。[GOF 《设计模式》]。
如何理解:
  比如我们日常使用的电视机遥控板,空调遥控板等等,它们就是我们所使用的具体电气系统(电视,空调)对用户提供的统一的使用接口(界面)Facade,接口上的每一个功能都对应被操控对象(电视、空调)内部的一系列复杂的操作,这些操作是由电气系统自身进行协调动作的,用户并不知它们具体的工作方式和工作细节,以及它们内部具体又有多少子系统以及这些子系统如何使用.....,用户只需要知道,遥控板上提供了哪些功能键,按下它们会有什么作用,仅此而已。
下面我们就以电视为例来说明Facade所起的作用(当然,我们只是为说明而举例,电视机内部真正有哪些子系统,它们如何工作对我们说明此例无关大碍)
程序如下图:

            
1、电视机内部复杂的子系统及它们提供的工作方法

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  TVFacade
ExpandedBlockStart.gifContractedBlock.gif
{
    
//客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。
    
//电视机内部诸多复杂的子系统,如果用户只能通过具体操作这些子系统来让电视机工作,则对用户而言无疑是苦不堪言,很显然,我们不能让这些子系统直接暴露在用户面前


ContractedSubBlock.gifExpandedSubBlockStart.gif    
遥控信号处理子系统#region 遥控信号处理子系统
    
public class SubSystemYaoKong
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public void YaoKongReceive()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"遥控器信号接收子系统工作");
        }

        
public void YaoKongAnalyse()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"遥控器信号分析子系统工作");
        }

    }

    
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif    
频段转换子系统#region 频段转换子系统
    
public class SubSystemPingDuan
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public void ChangePingDuan()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
             Console.WriteLine(
"频段转换子系统工作");
        }

        
public void ShouShuoPingDuan()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"搜索频段子系统工作");
        }


        
public void SavePingDuan()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"保存频段子系统工作");
        }


        
public void LocatePingDuan()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"定位频段子系统工作");
        }


    }


    
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif    
节目信号处理子系统#region 节目信号处理子系统
    
public class SubSystemInfo
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public void ReceiveInfos()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"电视信号接收");
        }

        
public void AnalyseInfo()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"电视信号分析处理");
        }


        
public void AnalyseTransfer()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"电视信号转换处理");
        }


        
public void AnalyseShow()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"电视信号显示处理");
        }


    }


    
#endregion



ContractedSubBlock.gifExpandedSubBlockStart.gif    
音频子系统#region 音频子系统
    
public class SubSystemSounds
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public void SoundPatternSave()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"音频模式存储子系统");
        }

        
public void SoundLarger()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"音频数字放大子系统");
        }

        
public void SoundWisdom()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"智能音频管理子系统");
        }


    }


    
#endregion

}

2、我们创建的TVFacade,它才是用户直接打交道的界面

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  TVFacade
ExpandedBlockStart.gifContractedBlock.gif
{
    
// 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?这就是Facade需要解决的问题。
    
//此处,通过TVFacde,对内我们协调了电视机内部各子系统的工作,对外我们提供了统一的工作接口,外部客户程序只能通过此处提供的对外接口来操作我们的电视机
    class TVFacade
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        SubSystemInfo info;
        SubSystemPingDuan pingduan;
        SubSystemSounds sound;
        SubSystemYaoKong yaokong;


        
public TVFacade()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
this.info = new SubSystemInfo();
            
this.pingduan = new SubSystemPingDuan();
            
this.sound = new SubSystemSounds();
            
this.yaokong = new SubSystemYaoKong();
        }


ContractedSubBlock.gifExpandedSubBlockStart.gif        
TVFacade对外提供的接口#region TVFacade对外提供的接口

ContractedSubBlock.gifExpandedSubBlockStart.gif        
自动搜索频道接口#region 自动搜索频道接口
        
public void ScanPingDao()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            yaokong.YaoKongReceive();
            yaokong.YaoKongAnalyse();
            info.ReceiveInfos();
            info.AnalyseInfo();
            pingduan.LocatePingDuan();
            pingduan.SavePingDuan();
            info.AnalyseTransfer();
            info.AnalyseShow();
        }

        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
音频模式设置接口#region 音频模式设置接口
        
public void SetSoundsMode()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            yaokong.YaoKongReceive();
            yaokong.YaoKongAnalyse();
            sound.SoundPatternSave();
            sound.SoundWisdom();
        }


        
#endregion


        
#endregion

    }

}

 

3、对TVFacade的使用

 

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  TVFacade
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
// 使用Facade提供的高层接口来控制我们的电视机

            TVFacade tv 
=   new  TVFacade();
            Console.WriteLine(
" -----------按下TV遥控板的自动搜索频道按键---------- " );
            tv.ScanPingDao();
            Console.WriteLine(
" -----------按下TV遥控板的剧场音效设置按键---------- " );
            tv.SetSoundsMode();

            Console.ReadLine();
        }
    }
}

程序运行效果如下:

                        

总结

  Facade模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。
效果及实现要点
1.Facade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2.Facade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。
3.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。

适用性
1.为一个复杂子系统提供一个简单接口。
2.提高子系统的独立性。
3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

 

前往:设计模式学习笔记清单

转载于:https://www.cnblogs.com/wsdj-ITtech/archive/2009/10/05/1578110.html

相关文章:

  • 自己动手,实现“你的名字”滤镜
  • 再谈ASP.NET第一 - ASP.NET2.0的回调机制
  • Yue Fei's Battle(组合计数递推)
  • apache地址限制和用户访问
  • Zigbee
  • 我谈通“下水道”(系列连载6)--新的征程
  • SpringBoot入门——应用devtools进行热部署
  • 对Action方法的参数进行双向转化
  • MATLAB中帮助的几种使用方法
  • 伪静态技术说明
  • Java中Model1和Model2
  • config jre for openoffice3.0
  • 2017敏捷沙滩大会概述:学习、心理安全和持续交付的重要性
  • 简洁的一键SSH脚本
  • Page-Enter、Page-Exit的使用
  • [PHP内核探索]PHP中的哈希表
  • SegmentFault for Android 3.0 发布
  • $translatePartialLoader加载失败及解决方式
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Bootstrap JS插件Alert源码分析
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Docker: 容器互访的三种方式
  • express如何解决request entity too large问题
  • JAVA并发编程--1.基础概念
  • 笨办法学C 练习34:动态数组
  • 高性能JavaScript阅读简记(三)
  • 判断客户端类型,Android,iOS,PC
  • 新书推荐|Windows黑客编程技术详解
  • 正则与JS中的正则
  • ​批处理文件中的errorlevel用法
  • # Maven错误Error executing Maven
  • #pragma 指令
  • #控制台大学课堂点名问题_课堂随机点名
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (175)FPGA门控时钟技术
  • (2)Java 简介
  • (3)选择元素——(17)练习(Exercises)
  • (C语言)球球大作战
  • (HAL库版)freeRTOS移植STMF103
  • (MATLAB)第五章-矩阵运算
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (办公)springboot配置aop处理请求.
  • (补)B+树一些思想
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (五)网络优化与超参数选择--九五小庞
  • (循环依赖问题)学习spring的第九天
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)jQuery 基础
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 使用 XPath 来读写 XML 文件