一、定义
要求一个子系统与其它系统信息的交互必须通过一个统一的类来进行,这个类就是门面类。在一个子系统里面,这种门面类可能不止一个,但是每一个门面类都只是向外界提供子系统中类的访问方法。
二、实例
我们一定去邮局寄过东西,现在的邮局功能很多,跨国邮件、大型邮件、快件等等各种功能,每一种功能邮局里都有相对应的窗口进行服务。我们不需要知道哪些窗口是怎么工作的,邮局的人是怎么包东西、怎么寄东西的,我们只要把东西和必要信息给窗口的工作人员就行了,这里的各种窗口就相当于门面模式中的门面类。我们来模拟一下上面的这个场景。
先定义一个邮局发送信件的接口,其中,只有sendWritter是高层模块能够调用的,其他方法都是只能在子系统中调用。
public interface ISendmail {
public void setInfo(Object object,String address);
public void packageing();
public void send();
public void sendWritter(Object object,String address);
}
实现邮局类
public class EMS implements ISendmail{
@Override
public void setInfo(Object object, String address) {
System.out.println("邮件内容:"+object.toString()+"目的地址:"+address);
}
@Override
public void packageing() {
System.out.println("打包");
}
@Override
public void send() {
System.out.println("发送邮件");
}
@Override
public void sendWritter(Object object, String address) {
this.setInfo(object, address);
this.packageing();
this.send();
}
}
邮局开放的窗口
public class EMSWindow {
private EMS ems = null ;
public EMSWindow() {
this.ems = new EMS();
}
public void sendWritter(Object object,String address) {
this.ems.sendWritter(object, address);
}
}
测试类
public class Test {
public static void main(String[] args) {
EMSWindow emsWindow = new EMSWindow();
emsWindow.sendWritter("苹果", "njust");
}
}
结果
邮件内容:苹果目的地址:njust
打包
发送邮件
三、本质
我觉得门面模式的本质就是将对其它系统提供功能的类或函数放到一起,也就是说把子系统的功能封装到一个类里面。
在上面的例子中,门面类对外提供了sendWritter函数作为子系统对外提供的功能,不管邮局的人怎么传递你的邮件,飞机、火车、汽车、轮船、量子传送门等等,你只要把该给的信息给他就行了。
四、注意
门面类不应该参与子系统业务逻辑,也就是说门面类只能对外提供接口函数,但是这个函数里面的内容也只不过是调用子系统中某个类的某个函数而已。