1、外观模式概述
外观模式(Facade Pattern)定义了一个高层接口,为子系统中的一组接口提供一个统一访问入口,这个接口使子系统接口更加容易适用。外观模式又称为门面模式,它是一种对象结构型模式。
2、外观模式结构
外观模式包含如下角色:
Facade: 外观角色
SubSystem:子系统角色
3、外观模式代码实现
/**
* 外观对象
*
* @author kaifeng
* @date 2018/12/31
*/
public class Facade {
private SystemA systemA;
private SystemB systemB;
private SystemC systemC;
public Facade() {
systemA = new SystemA();
systemB = new SystemB();
systemC = new SystemC();
}
public void wrapOpration() {
System.out.println(systemA.operationA());
System.out.println(systemB.operationB());
System.out.println(systemC.operationC());
}
}
/**
* 子系统A
*
* @author kaifeng
* @date 2018/12/31
*/
public class SystemA {
public String operationA() {
return "【SystemA】- 我是方法 operationA";
}
}
/**
* 子系统B
*
* @author kaifeng
* @date 2018/12/31
*/
public class SystemB {
public String operationB() {
return "【SystemB】- 我是方法 operationB";
}
}
/**
* 子系统 C
*
* @author kaifeng
* @date 2018/12/31
*/
public class SystemC {
public String operationC() {
return "【SystemC】- 我是方法 operationC";
}
}
客户端调用
public class FacadeDemo {
public static void main(String[] args) {
Facade facade=new Facade();
facade.wrapOpration();
}
}
【SystemA】- 我是方法 operationA
【SystemB】- 我是方法 operationB
【SystemC】- 我是方法 operationC
4、外观模式优点
-
对客户端屏蔽子系统组件,减少了客户端处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。
-
实现了子系统与客户端之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
-
降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
-
提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
5、外观模式缺点
-
不能很好地限制客户端使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
-
在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
6、外观模式适用场景
-
为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
-
客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
-
在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。