门面模式

门面(Facade)模式

门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面(Façade)对象进行,这就是门面模式。

举例:医院的例子

用一个例子进行说明,如果把中国大陆的医院作为一个子系统,按照部门职能,这个子系统可以划分为挂号,门诊,划价,收费,取药等。看病的人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样。

 

未使用门面模式

             

 

经过门面模式的改装后

 

 

 

什么是门面模式:

门面模式要求一个子系统的外部与其内部的通信必须通过一个统一门面(Facade)对象进行,门面模式提供一个高层次的接口,使得子系统更易使用。

门面模式是对象的结构模式,下图所示就是一个门面模式的示意图:

 

 

门面(Facade)模式角色:客户端可以调用这个角色方法,此角色知晓相关的(一个或者多个)子系统的功能和责任,在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去。

子系统(Subsystem)角色:可以同时又一个或多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用,子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

门面模式的实现:

一个系统可以有几个门面类

在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类,当然这并不意味者在整个系统里只能有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个系统的话,每一个子系统都有一个门面类,整个系统都可以有数个门面类。

为子系统增加新行为:

初学者往往以为通过继承一个门面类便可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,为不能向子系统加入新的行为。

仍以医院为例,接待员并不是医护人员,接待员并不能为病人提供医疗服务。

如果一个门面模式不能将子系统所有的行为提供给外界,那么可以通过修改门面类或者继承门面类的办法,使门面类或其子类能够将子系统的行为提供给外界。但是,如果一个子系统没有某个行为,想通过修改门面类或者继承门面类的办法来提供这个心的行为是错误的。

什么情况下使用门面模式?

为一个复杂子系统提供一个简单接口

子系统往往因为不断演化而变的越来越复杂,使用门面模式可以使得子系统更具有可复用性。Façade模式可以提供一个简单的默认视图,多大多数用户来说这个视图已经足够用了,而那些需要进一步继承的用户可以越过Façade层直接对子系统进行继承。

子系统的独立性,一般而言,子系统和其他的子系统之间、客户端与实现层之间存在着很大的依赖性。引入Façade模式将一个子系统与它的客户端以及其他的子系统分离,可以提高子系统的独立性和移植性。

层次化结构,在构建一个层次化的系统时,可以使用Façade模式定义系统中每一层的入口。如果层与层之间是相互依赖的,则可以限定它们仅通过Façade进行通信,从而简化层与层之间的依赖关系。

迪米特法则(LoD)迪米特法则说:“只与你直接的朋友们通信”。迪米特法则要求每一个对象与其他对象的相互作用是短程的,而不是长程的。只要可能,朋友的数目越少越好。换言之,一个对象只应当知道它的直接合作者的接口。

门面模式创造出一个门面对象,将客户端所涉及的属于一个子系统的协作伙伴的数目减到最少,使得客户端与子系统内部的对象的相互作用被门面对象所取代。显然,门面模式就是实现代码重构以便达到迪米特法则要求的一个强有力的武器。

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(门面模式)