外观模式也叫门面模式, 它为子系统提供统一入口,封装系统复杂性。如同医院看病,病人需要与挂号,门诊,划价,化验,收费,取药等部门打交道
如同一个子系统客户端和另一个子系统各个类打交道一样,相互耦合处理复杂,如果引入门面模式,在医院增加一个接待员,由接待员复制与上面各个
部门打交道,那么对于病人这个客户端来说就容易很多。
门面模式主要就两个角色。
门面角色:客户端调用该角色方法。该角色包好各子系统的功能。
子系统角色:完成子系統各功能
例子:模拟注册公司流程
1:未使用门面模式时,流程图如下
2.使用了门面模式后(增加门面对象)
interface GongShang {
boolean checkName();
}
/**
* 模擬工商局
*/
public class BeijinGongShang implements GongShang{
@Override
public boolean checkName() {
System.out.println("北京工商局检查");
return false;
}
}
interface ShuiWu {
boolean checkCertificate();
}
/**
* 模拟税务局
*/
public class BeijinShuiWu implements ShuiWu {
@Override
public boolean checkCertificate() {
System.out.println("北京稅務局");
return false;
}
}
interface Zhijian{
boolean checkType();
}
public class BeijinZhijian implements Zhijian{
@Override
public boolean checkType() {
System.out.println("北京質監局");
return false;
}
}
/**
* 办理注册公司流程的门面对象
*
*/
public class RegisterFacade {
public void register(){
GongShang a = new BeijinGongShang();
a.checkName();
Zhijian b = new BeijinZhijian();
b.checkType();
ShuiWu c = new BeijinShuiWu();
c.checkCertificate();
}
}
public class Client {
public static void main(String[] args) {
//使用门面模式只需要调用门面角色的方法
new RegisterFacade().register();
}
}
从上面的实例来看,有了这个門面类,也就是RegeisterFacader类,用户就不用亲自去调用子系统中类了,不需要知道系统内部的实现细节,甚至都不用知道系统内部的构成。
客户端只需要跟门面类交互就可以了。