您的位置:首页 > 其它

我学设计模式 之 门面模式

2010-09-22 19:02 441 查看
我学设计模式之门面模式

1. 简介
门面模式说对象的结构模式。外部与一个子系统的通信必须通过一个系统的一个门面对象进行,这就是门面模式。门面模式也成为外观模式、正面模式。
这个模式在系统中经常被用到,也是一个比较简单的模式。

2. 门面模式的结构
Façade的UML图如下:



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

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

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当中,也可以认为HibernateTemplate是SessionFactory、Session、Query等类的门面类,当客户单需要进行持久化查询时,程序无需调用这些类,而是直接调用HibernateTemplate门面类的方法即可。
ü 在设计阶段,应该有意识的将不同的两个层分离。比如经典的三层架构,就是需要考虑数据访问从和业务逻辑层、业务层和表示层的层与层之间建立外观Façade,这样可以为复杂的子系统提供一个简单的接口,是的耦合度大大降低。
ü 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数模式使用时也都会产生很多很小的类,这本是件好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Façade可以提供一个简单的接口,减少它们之间的依赖。
ü 在维护一个遗留的大系统时,可能这个系统已经非常难以维护和扩展了,但他们包含非常重要的功能,新的需求开发必须依赖于它。此时用外观模式Façade也是非常合适的。你可以为新系统开发一个外观Façade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Façade对象交互,Façade与遗留代码交互所有复杂的工作。

5. 门面模式的优缺点
a) 为一个复杂子系统提供一个简单的接口。
b) 子系统的独立性
c) 是层次结构化
d) 减少依赖、降低耦合度

6. 参考文档
《Java与模式》
《大话设计模式》

待续……………..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: