门面模式
来源:互联网 发布:淘宝远望数码手机真假 编辑:程序博客网 时间:2024/04/30 14:38
一. 定义
Provide aunified interface to a set of interfaces in a subsystem.Facade defines ahigher-level interface thatmakes the subsystem easier to use.(要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个更高层次的接口,使得子系统更易于使用。)
二.个人理解
①门面系统只是单纯地调用子系统的功能,提供给外界一个方法来代表一个子系统的功能。不管子系统功能实现换了什么算法,都无需变化。不允许含有业务逻辑。
三.描述Façade:门面角色。知晓子系统的所有功能和责任,将所有从客户端发来的请求委派到相应的子系统去,也该角色没有实际的业务逻辑,只是一个委托类。
public class Facade {
//被委托的对象
private ClassA a = new ClassA();
private ClassB b = new ClassB();
private ClassC c = new ClassC();
}
public class ClassB {
publicvoid doSomethingB(){
//业务逻辑
}
}
public class ClassC {
publicvoid doSomethingC(){
//业务逻辑
}
}
优点:,如果我们不使用门面模式,外界访问直接深入到子系统内部,相互之间是一种强耦合关系,你死我就死,你活我才能活,这样的强依赖是系统设计所不能接受的,门面模式的出现就很好地解决了该问题,所有的依赖都是对门面对象的依赖,与子系统无关。不管子系统内部如何变化,只要不影响到门面对象,任你自由活动。简单易用,划分层次,一个是外部层次,暴露给外部使用的功能,一个是内部层次,是内部可能修改的方法和实现等;
缺点:要是门面对象除了问题,那可就麻烦咯。
六.经验
①如果还需有一个只能提供部分功能的门面(受限的门面,可以有多个门面),可以有多个门面:
publicclass Facade2 {
//引用原有的门面,原有的门面能提供所有功能
privateFacade facade = new Facade();
//对外提供唯一的访问子系统的方法
publicvoid methodB(){
this.facade.methodB();
}
}
②在门面模式中,门面角色应该是稳定,它不应该经常变化,一个系统一旦投入运行它就不应该被改变。
六:例子
① 医院的接待员。
你去医院,你只管和接待员交流,而接待员替你去和各部门进行沟通。
② 在tomcat中的使用
使用原因:用门面模式进行隔离;子系统不想把内部细节过多得暴露给外界(这里的外界指的可以不是client,可以是其他的要使用子系统功能的组件)。
写servlet需要继承httpservlet
其中传递过来的参数类型是HttpServletRequet,不过,实际对象的真实类型是什么呢。传递过来的是Request.getRequest()。再看此方法:
由上可知:并没有把Request传递过来,传递过来的是门面。
原因:Request中很多方法都是与内部组件进行交互的,这些方法设置为public只是为了和内部组件交互的需求,并不想让外界随意调用。如果直接传递Request,存在程序员随意操作那些方法对系统造成破坏的后果(只需将HttpServletRequet转型为Request)。所以我,只提供一个门面类,屏蔽内部的交互细节,并防止调用内部方法,只提供给外界需要的方法的接口(这些接口都是一些封装的只对外界提供的屏蔽内部细节的方法)。