软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理
一、简介
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
它的组成:
- 外观角色(Facade):为多个子系统对外提供一个共同的接口。外观角色知晓相关的子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
- 子系统角色(SubSystem):实现系统的部分功能,客户可以通过外观角色访问它。每个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并不知道外观的存在,对于子系统而言,外观仅仅是另外一个客户端而已。
二、实例
外观模式还是挺常用的,Spring Jdbc、Mybatis、Tomcat 、SLF4J 中都有外观模式的身影。
1、外观类(Facade)
public class Facade {
//被委托的对象
SubSystemA a;
SubSystemB b;
public Facade() {
a = new SubSystemA();
b = new SubSystemB();
}
//提供给外部访问的方法
public void methodA() {
this.a.doSomethingA();
}
public void methodB() {
this.b.doSomethingB();
}
}
2、子系统角色A(SubSystemA)
public class SubSystemA {
public void doSomethingA() {
System.out.println("子系统方法A");
}
}
3、子系统角色B(SubSystemB)
public class SubSystemB {
public void doSomethingB() {
System.out.println("子系统方法B");
}
}
4、测试类
public class Main {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
}
}
控制台输出:
子系统方法A
子系统方法B
三、总结
1、优点
- 减少了系统的相互依赖。
- 提高了灵活性。不管系统内部如何变化,只要不影响到外观对象,任你自由活动。
- 提高了安全性。想让你访问子系统的哪些业务就开通哪些逻辑,不在外观上开通的方法,你就访问不到。
2、缺点
- 不符合开闭原则,修改很麻烦,继承重写都不合适。
3、应用场景
- 为一个复杂的模块或子系统提供一个外界访问的接口。
- 子系统相对独立,外界对子系统的访问只要黑箱操作即可。
- 预防低水平人员带来的风险扩散。