外观模式(Facade)解析例子

简介:
摘要:本文深入浅出的讲述了设计模式中的外观模式 , 并给出了简单的示例 , 例子浅显易懂 , 并附带源代码。
       外观模式属于结构型模式,其意图是为子系统中的一组接口提供一个一致的界面, Façade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。在项目设计中,把一个系统划分成为若干个子系统由利于降低系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,达到该目标的途径之一就是引入一个外观对象,它为子系统中较一般的设施提供了一个单一而简单的界面。
       实用性:
l          当需要为一个复杂子系统提供一个简单的接口时。子系统往往因为不断演化而变得越来越复杂,大多是模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行订制,但是这也给那些不需要订制子系统的用户带来一些使用上的困难。
l          客户程序与抽象类的实现部分之间存在很大的依赖性,引入 façade 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
l          当你需要构建一个层次结构的子系统时,使用 Façade 模式定义子系统中每层的入口点,如果子系统间是相互依赖的,你可以让他们通过 Facade 进行通讯,从而简化他们之间的依赖关系。
例如在一个泡茶的过程中,需要作如下的工作:烧开水,准备茶叶,把茶叶放在被子里,把烧开的水放到茶杯中,只有经过这些过程之后才能泡出好的茶叶来。这是一个常用的步骤, 80% 的泡茶步骤都是这个样子的,可以把这些动作串联起来,形成一个整体的步骤,就是 MakeACuppa() ,这样在调用步方法时也比较方便。这便是外观模式,里面的细节被屏蔽掉了。当然如果想更详细的控制每个步骤地过程,也允许进行相应的控制,但是必须自己创建类。
1
参与者:
      Façade(DacadeCuppaMaker): 知道那些子系统类负责处理请求;将客户的请求代理给适当的子系统。
      SubSystem classes water Teabag ):实现自系统的功能,处理由 Façade  对象指派的任务,没有 Facade 的任何相关信息,即没有指向 Façade 的指针。
他们之间的协作关系是:客户程序通过发送请求给 Façade 的方式与子系统通讯, Facade 将这些消息转发给适当的子系统对象,尽管是子系统的有关对象在做实际工作 , Façade 模式本身也必须将它的接口转换成子系统的接口。使用 façade 的客户程序不需要直接访问子系统对象。
       使用 Façade 模式有下面一些优点:
1.        他对客户屏蔽子系统组件,因而减少了客户处理的对象的树木并使得子系统使用起来更加方便。
2.        实现了自系统与客户之间的松散耦合关系,而自系统内部的功能组件往往是紧耦合的。松耦合关系使得自系统的组件变化不会影响到他的客户。
3.        如果需要他们不限制他们使用子系统类。
在本系统中, Teacup 使用 water TeaBag 泡一杯茶水,泡茶的过程比较复杂,这相当于一个子系统,在这个子系统中泡茶的每一个步骤都是紧密相连的,如果使用每个子类按照泡茶的步骤一步步地走下来也可以达到目的,但是在这个过程中需要创建子类,调用子类的方法,或者检测子类的变量,而在客户端大部分的操作都是使用一样的代码,把这些一样的代码抽取出来形成一个能完成一特定功能的类,便形成了 Façade 模式的代码。使用了 Façade 模式就使得这些操作聚合在一起,方便客户端调用。
相应的代码:
Water 代码:
package  facade;
public   class  Water{
     boolean   waterIsBoiling ;
     public  Water(){
       setWaterIsBoiling( false );
       System. out .println( " 纯净的水准备好了 " );
    }
     public   void  setWaterIsBoiling( boolean  isWaterBoiling){
        waterIsBoiling  = isWaterBoiling;
    }
     public   boolean  getWaterIsBoiling(){
        return   waterIsBoiling ;
    }
     public   void  boilFacadeWater(){
       setWaterIsBoiling( true );
       System. out .println( " 水在沸腾 " );
    }
}
TeaBag 代码:
package  facade;
public   class  TeaBag{
     public  TeaBag(){
       System. out .println( " 清香的茶包准备好了 !" );
    }
}
TeaCup 代码:
package  facade;
public   class  TeaCup{
     private   boolean   teaBagIsSteeped ;
     private  Water  facadeWater ;
     private  TeaBag  facadeTeaBag ;
     public  TeaCup(){
       setTeaBagIsSteeped( true );
       System. out .println( " 茶杯准备好了 " );
    }
     public   void  setTeaBagIsSteeped( boolean  isTeaBagSteeped){
        teaBagIsSteeped  =  true ;
    }
     public   boolean  getTeaBagIsSteeped(){
        return   teaBagIsSteeped ;
    }
     public   void  addFacadeTeaBag(TeaBag facadeTeaBagIn){
        facadeTeaBag  =  facadeTeaBagIn ;
       System. out .println( " 茶包放在茶杯了 " );
    }
     public   void  addFacadeWater(Water facadeWaterIn){
        facadeWater  = facadeWaterIn;
    }
     public   void  steepTeaBag(){
        if ( facadeTeaBag  !=  null  && facadeWater  !=  null  &&  facadeWater .getWaterIsBoiling()){
       System. out .println( " 茶叶渗透到杯子中了 " );
       setTeaBagIsSteeped( true );
       }
        else {
           System. out .println( " 茶叶没有渗透到杯子中 " );
           setTeaBagIsSteeped( false );
       }
    }
     public  String toString(){
        if (getTeaBagIsSteeped()){
            return   " 一杯又香又浓的茶冲好了 " ;
       }
        else
            return   " 一杯又香又浓的茶冲好了 " ;
    }
}
FacadeCuppaMaker 代码;
package  facade;
public   class  FacadeCuppaMaker{
     private   boolean   TeaBagIsSteeped ;
     public  FacadeCuppaMaker(){
       System. out .println( "FacadeCuppaMaker  准备好冲茶了 " );
    }
     public  TeaCup makeACuppa(){
       TeaCup cup =  new  TeaCup();
       TeaBag teaBag=  new  TeaBag();
       Water water =  new  Water();
       cup.addFacadeTeaBag(teaBag);
       water.boilFacadeWater();
       cup.addFacadeWater(water);
       cup.steepTeaBag();
        return  cup;
    }
}
Client 代码:
package  facade;
public   class  Client{
     public   static   void  main(String[] args){
       FacadeCuppaMaker cuppaMaker =  new  FacadeCuppaMaker();
       TeaCup teaCup = cuppaMaker.makeACuppa();
       System. out .println(teaCup);
    }
}
总结: 外观模式的主要用途就是为子系统的复杂处理过程提供方便的调用方法,使得子系统更加容易被使用。Façade对象通常属于Singleton模式。
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/36741如需转载请自行联系原作者

lili00okok
相关文章
|
设计模式
二十三种设计模式全面解析-解锁外观模式的神秘面纱:深入探讨外观模式的魔力
二十三种设计模式全面解析-解锁外观模式的神秘面纱:深入探讨外观模式的魔力
226 1
|
设计模式 算法 数据库
C/C++外观模式解析:简化复杂子系统的高效方法
C/C++外观模式解析:简化复杂子系统的高效方法
345 0
|
设计模式
二十三种设计模式全面解析-外观模式(Facade Pattern)详解:简化复杂系统的奇妙之道
二十三种设计模式全面解析-外观模式(Facade Pattern)详解:简化复杂系统的奇妙之道
427 0
|
设计模式 Java
简化复杂系统:深入解析Java设计模式中的外观模式
在软件开发领域,设计模式是一套经过验证的最佳实践方法,用于解决各种常见问题。外观模式是一种结构型设计模式,其目标是为复杂子系统提供一个简单的接口。在本文中,我们将深入探讨外观模式的核心思想,以及它在Java中的实际应用。
297 0
|
设计模式 Java 开发工具
设计模式之外观模式 附Java示例解析
设计模式之外观模式 附Java示例解析
284 0
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
609 2
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
974 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1627 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
663 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

推荐镜像

更多
  • DNS