外观模式
前言
- 迪米特法则(最少知识原则):
一个软件实体应当尽可能少的与其他实体发生相互作用 - 外观模式核心:
为子系统提供统一的入口。封装子系统的复杂性,便于客户端调用。
一、具体实现
以抽屉问题为例,假设我们把文件放在了第二个抽屉里面,而第二个抽屉的钥匙放在了第一个抽屉里面。假如是n个抽屉呢?客户要取出这个文件,客户不需要知道取钥匙的过程。他们只需要一个按钮,然后文件就会被取出。
1.抽屉类
/**
* 第一个抽屉
*/
public class DrawerOne {
public void open(){
System.out.println("打开了第一个抽屉");
getKey();
}
public void getKey(){
System.out.println("得到了第二个抽屉的钥匙");
}
}
/**
* 第二个抽屉
*/
public class DrawerTwo {
public void open(){
System.out.println("打开了第二个抽屉");
getFile();
}
public void getFile(){
System.out.println("得到了这个重要文件");
}
}
2.外观类
/**
* 外观
*/
public class DrawerFacade {
DrawerOne drawerOne = new DrawerOne();
DrawerTwo drawerTwo = new DrawerTwo();
public void open(){
drawerOne.open();
drawerTwo.open();
}
}
3.测试类
/**
* 客户类
*/
public class Client {
public static void main(String[] args) {
DrawerFacade drawerFacade = new DrawerFacade();
drawerFacade.open();
}
}
结果:
二、应用场景
- JDBC封装后的,commons提供的DBUtils类
- Hibernate提供的工具类
- Spring JDBC工具类
总结
- 应用
1.为一个复杂子系统提供一个接口
2.提高子系统的独立性
3.在层次结构中,可以使用Facade模式定义系统中的每一层入口 - 优点
1.对客户屏蔽子系统组件,减少了客户处理对象数目,从而使子系统使用更方便
2.实现了系统与客户之间的松散耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到其客户。
3.如果需要,也不限制使用子系统类。