• 公号-云原生程序员
    2018-06-05
    门面模式形象上来讲就是在原系统之前放置了一个新的代理对象,只能通过该对象才能使用该系统,不再允许其它方式访问该系统。该代理对象封装了访问原系统的所有规则和接口方法,提供的API接口较之使用原系统会更加的简单。

    举例:JUnitCore是JUnit类的 Facade模式的实现类,外部使用该代理对象与JUnit进行统一交互,驱动执行测试代码。

    使用场景:当我们希望封装或隐藏原系统;当我们使用原系统的功能并希望增加一些新的功能;编写新类的成本远小于所有人学会使用或者未来维护原系统所需的成本;

    缺点:违反了开闭原则。如有扩展,只能直接修改代理对象。
    展开

    作者回复: 不错

     1
     43
  • 南北少卿
    2018-06-05
    为什么我去查Runtime的源码,currentRuntime没有被final修饰呢?

    作者回复: 什么版本?我这是最新的

    
     22
  • 云学
    2018-06-09
    最开始迷恋设计模式,后来眼中没有模式,其实那本经典的设计模式的书的第一章就非常明确的指出设计模式不是银弹,总感觉java语言写的程序比c++更重,很多代码都是无用的装饰
     1
     18
  • Walter
    2018-06-07
    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。
    这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

    意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
    主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。
    何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。
    如何解决:客户端不与系统耦合,外观类与系统耦合。
    关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
    应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。
    优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
    缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
    使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。
    注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。
    展开

    作者回复: 不错,业务系统多见

    
     10
  • 田维俊
    2018-06-06
    公司项目是一个基于spingboot、mybatis开发的web后端管理项目。现在的问题是 不同角色登录到系统看到的模块和模块里面的数据是不一样的,有时虽然看到的模块一样,但是由于角色不一样,所以显示的数据是不一样,在这样的情况下,会经常在service层方法里面判断角色然后改变mapper的数据操作条件或调用mapper的不同方法。由于在service层频繁的判断角色感觉很不雅,新增角色就要加判断,哎,感觉可以用策略设计模式,可是不知道怎么具体设计。
     2
     10
  • sunlight001
    2018-06-05
    结合流行的开源框架,或者自己的项目学设计模式是很好的办法,生学很容易看不懂学不下去,xxxfascade是门面模式,为复杂的逻辑提供简单的借口,设计模式学的时候还能明白,但是用的时候就不知道该怎么用了,我们怎么在项目中使用设计模式呢?

    作者回复: 不必为了模式而用,优先解决开发、维护中的痛点

    
     10
  • yearning
    2018-06-05
    Facade(外观模式)
    接口隔离模式。处理组件中外部客户程序和组件中各种复杂的子系统高耦合情况,定义一个高层接口,为子系统中的一组接口提供一个一致(稳定)的界面,使得更简单的使用。
    facade简化整个组件系统的接口,同时子系统的任何变化都不会影响到facade接口。

    有一个更简单的称呼,门面模式,打个比方说,你去商店,你只需要告诉店员,你需要什么,至于商店中复杂的采购系统,库存系统,收银系统一概对你不可见。

    在经常使用的hibernate,当我们想插入一条用户信息,facade接口中insert(User user),我们只要传递User对象,至于背后的操作对外部调用是不可见。

    facade模式是从架构的层次去看整个系统,而是一两个类之间单纯解耦。
    展开
    
     6
  • So Leung
    2018-08-29
    屏蔽掉复杂的系统,提供一个对外的简单的接口供别人调用,比如某个人想开一家商店可能要去很多的部门审批手续,比如税务、公司、卫生等等。但是有一天这些部门提供了一个统一的窗口,大家通过这个窗口可以办完所以的流程。这就是外观模式的一个现实抽象。

    作者回复: 很形象

     1
     5
  • 李志博
    2018-06-05
    Spring 内部的asm 模块 用到了访问者模式
    
     5
  • 星空
    2018-06-05
    外观模式为子系统中一组接口提供一个统一访问的接口,降低了客户端与子系统之间的耦合,简化了系统复杂度。缺点是违反了开闭原则。适用于为一系列复杂的子系统提供一个友好简单的入口,将子系统与客户端解偶。公司基础paas平台用到了外观模式,具体是定义一个ServiceFacade,然后通过继承众多xxService,对外提供子xxService的服务。

    作者回复: 业务开发很普遍

    
     4
  • Sin0
    2018-06-05
    有一点理解不太一致,单例模式double check中synchronized就已经可以提供可见性,volatile的作用主要体现在禁指令重排!

    作者回复: 不冲突,sync也不是必然走到

    
     4
  • 润兹
    2018-06-05
    在没用facade之前,为了完成某个功能需要调用各子系统的各方法进行组合才能完成,用了facade之后相当于把多个方法调用聚合成了一个方法,方便用户调用。
    
     4
  • 君莫惜
    2019-01-08
    外观模式是定义一个高层接口来更方便的去调用低层接口,比如mvc,service的接口就是高层接口,而dao中就是低层接口

    作者回复: 是的

     1
     3
  • wutao
    2018-06-05
    Spring中还用到了策略模式吧

    作者回复: 当然,列出的只是简要说明

    
     2
  • 李永垒
    2019-12-09
    jdk1.8 java.lang.Runtime 中currentRuntime没有声明为final的
    
     1
  • clz1341521
    2018-08-05
    facade门面模式,为了减少对子线实现的依赖,将子类实现统一封装。实现调用封装类。达到所谓的“封装交互,简化调用”
    
     1
  • Miaozhe
    2018-06-08
    我理解Facada模式,微服务应用场景,如:Nginx对系统子服务进行管理和IP反向代理,提供统一的服务,就是屏蔽外部系统对内部服务的具体实现,以及各微服务的部署虚拟机和URL。
    再者,容器Docker技术,我认为这是Facada模式,通过镜像把应用相关的组件和配置都预置好,发布这个服务时,直接启动容器,用户不用关心里面的任何细节。

    杨老师看看,我分析的对吗?
    展开
    
     1
  • softpower2018
    2018-06-05
    通过封装的方式,对外屏蔽内部复杂业务逻辑,实现使用方与具体实现的分离。门面模式
    
     1
  • Geek_028e77
    2018-06-05
    facade模式 主要屏蔽系统内部细节实现,通过facade模式封装统一的接口 提供给外部调用着.有一个优势 ,当内部系统做变更 优化时,这对外部调用者来说是透明的,一定程度上降低了系统间耦合性...个人理解
    
     1
  • 西兹兹
    2019-11-10
    不认同老师说的内部类实现单例不好。 双检索加volatile模式个人不看好,因为外部调用执行影响cpu缓存行和指令冲排序优化
    
    
我们在线,来聊聊吧