我学设计模式 之 门面模式

我学设计模式之门面模式

 

1.       简介

门面模式说对象的结构模式。外部与一个子系统的通信必须通过一个系统的一个门面对象进行,这就是门面模式。门面模式也成为外观模式、正面模式。

这个模式在系统中经常被用到,也是一个比较简单的模式。

 

2.       门面模式的结构

FaçadeUML图如下:

 

 

门面模式主要由以下几个角色:

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

 

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

 

3.       门面模式的用法

这个模式比较简单,相信大家一般也都用过。举一个简单的例子:

服务类A/B/C如下:

package com.zsw.facade;

 

public class ServiceA {

    public void methodA(){

       System.out.println("方法A");

    }

}

package com.zsw.facade;

 

public class ServiceB {

    public void methodB(){

       System.out.println("方法B");

    }

}

package com.zsw.facade;

 

public class ServiceC {

    public void methodC(){

       System.out.println("方法C");

    }

}

 

       门面类:

package com.zsw.facade;

 

public class Facade {

    private ServiceA serviceA;

    private ServiceB serviceB;

    private ServiceC serviceC;

   

    public Facade(){

       serviceA = new ServiceA();

       serviceB = new ServiceB();

       serviceC = new ServiceC();

    }

   

    public void methodA(){

       serviceB.methodB();

       serviceC.methodC();     

    }

   

    public void methodB(){

       serviceA.methodA();

       serviceC.methodC();     

    }

   

    public void methodC(){

       serviceA.methodA();

       serviceB.methodB();     

    }

}

客户端:

package com.zsw.facade;

 

public class Client {

    public static void main(String[] args) {

       Facade facade = new Facade();

       facade.methodA();

       facade.methodB();

       facade.methodC();

    }

}

 

 

4.       门面模式的应用场景

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

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

 

ü         子系统的独立性

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

 

ü         层次化结构

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

 

ü         Spring当中,也可以认为HibernateTemplateSessionFactorySessionQuery等类的门面类,当客户单需要进行持久化查询时,程序无需调用这些类,而是直接调用HibernateTemplate门面类的方法即可。

ü         在设计阶段,应该有意识的将不同的两个层分离。比如经典的三层架构,就是需要考虑数据访问从和业务逻辑层、业务层和表示层的层与层之间建立外观Façade,这样可以为复杂的子系统提供一个简单的接口,是的耦合度大大降低。

ü         在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数模式使用时也都会产生很多很小的类,这本是件好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Façade可以提供一个简单的接口,减少它们之间的依赖。

ü         在维护一个遗留的大系统时,可能这个系统已经非常难以维护和扩展了,但他们包含非常重要的功能,新的需求开发必须依赖于它。此时用外观模式Façade也是非常合适的。你可以为新系统开发一个外观Façade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Façade对象交互,Façade与遗留代码交互所有复杂的工作。

 

 

5.       门面模式的优缺点

a)         为一个复杂子系统提供一个简单的接口。

b)        子系统的独立性

c)        是层次结构化

d)        减少依赖、降低耦合度

 

 

6.       参考文档

Java与模式》

《大话设计模式》

 

待续……………..

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值