Facade的意图
为子系统提供一个接口,便于它的使用。
比如医院看病,咱们不知道医生的话是不是直接找接待员呢?,这个接待员再找适合医生来看病,直接上代码,清晰易懂:
几个医生类,不同医生不同职责
public class Doctor1 {
/*
* 作为一个医生的职责
* */
public void kanBing(){
System.out.println("感冒找我");
}
/*
* 其它,比如作为医生除了看病还做其它的涩,不需要给你看到
* */
public void other(){
}
}
public class Doctor2 {
/*
* 作为一个医生的职责
* */
public void kanBing(){
System.out.println("发烧找我");
}
/*
* 其它,比如作为医生除了看病还做其它的涩,不需要给你看到
* */
public void other(){
}
}
public class Doctor3 {
/*
* 作为一个医生的职责
* */
public void kanBing(){
System.out.println("神经病找我");
}
/*
* 其它,比如作为医生除了看病还做其它的涩,不需要给你看到
* */
public void other(){
}
}
弄个接待员(外观类),统一管理分配
public class Facade {
private Doctor1 doctor1;
private Doctor2 doctor2;
private Doctor3 doctor3;
//感冒你就找看感冒的医生,后面一样
public void ganMao(){
doctor1 = new Doctor1();
doctor1.kanBing();
}
//发烧你就找看发烧的医生,后面一样
public void faShao(){
doctor2 = new Doctor2();
doctor2.kanBing();
}
//神经病你就找看神经的医生,后面一样
public void shenJing(){
doctor3 = new Doctor3();
doctor3.kanBing();
}
}
病人来了,看下可以用不
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Facade facade = new Facade();
//来的是发烧病人,接待员调用发烧的医生去
facade.faShao();
}
}
可以看出来命令端是看不到我们具体的模块的,就是病人看不到医生在哪,医生有那些东东,只能找这个接待员(外观类)去调用它需要的。这就是外观类,比较简单
优点
1.便于维护,所有子模块都用一个外观管理
2.隐藏了内部结构的实现
3.更加易用,毕竟只需要跟外观类打交道。