外部与一个子系统的通信必须通过一个统一的门面对象进行。这就是门面模式。
门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
门面模式的结构
涉及两个角色:
门面角色:客户端可以调用这个角色的方法。此角色知道子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去。
子系统角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用,或者被门面角色调用。
public class Guahao {
public void register(){
System.out.println("进行挂号!");
}
}
public class Menzhen {
public void treat(){
System.out.println("治病!");
}
}
public class Jiaofei {
public void pay(){
System.out.println("缴费!");
}
}
public class Quyao {
public void getDrug(){
System.out.println("取药!");
}
}
public class Facade {
private Guahao register;
private Menzhen treatMent;
private Jiaofei payment;
private Quyao drugstore;
public Facade(){
register = new Guahao();
treatMent = new Menzhen();
payment = new Jiaofei();
drugstore = new Quyao();
}
//接待处挂号
public void register(){
register.register();
}
//接待处带着病人去治疗,这个地方有点不妥,毕竟病人需要和医生直接打交道,理解就好
public void treat(){
treatMent.treat();
}
//接待处缴费
public void pay(){
payment.pay();
}
//接待处取药
public void getDrug(){
drugstore.getDrug();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Facade facade = new Facade();
facade.register();
facade.treat();
facade.pay();
facade.getDrug();
}
医院看病的例子(一)
医院:其中一个子系统 ,门诊治疗系统
门诊治疗系统:挂号,门诊看病,化验,取药
病人:很多个客户端
医院看病的例子(二)
医院:其中一个子系统 ,门诊治疗系统
门诊治疗系统:挂号,门诊看病,化验,取药
门面(接待员):子系统(挂号,门诊看病,化验,取药),客户端(病人)
病人:很多个客户端
Ø一个系统可以有几个门面类
如果一个系统有好几个子系统的话,每一个子系统有一个门面类,整个系统可以有数个门面类
医院看病的例子(三)
门诊治疗系统:一个完整的系统
子系统:挂号系统,门诊看病系统,化验系统,取药系统
门面(接待员):子系统(挂号,门诊看病,化验,取药),客户端(病人)
病人:很多个客户端
在什么情况下使用门面模式
1.为一个复杂的子系统提供一个简单的接口。
2.引入门面模式可以将一个子系统与他的客户端以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3.层次化结构,如果层与层之间是互相依赖的,那么引用门面模式可以向鼎他们仅仅通过门面进行通信,从而简化了层与层之间的依赖关系。