定义
为子系统中的一组接口提供一个统一的入口。
角色
SubSystem(子系统角色)
子系统功能的具体实现,并提供给Facade(外观角色)调用。
public class SubSystemA { public void methodA(){ System.out.println("子系统A方法A"); }}复制代码
public class SubSystemB { public void methodB(){ System.out.println("子系统B方法B"); }}复制代码
Facade(外观角色)
在定义的方法中通过调用SubSystem(子系统角色)实现相应的功能,从而供客户端直接调用。
public class Facade { private SubSystemA subSystemA = new SubSystemA(); private SubSystemB subSystemB = new SubSystemB(); public void provideMthod() { subSystemA.methodA(); subSystemB.methodB(); }}复制代码
客户类
public class FacadeClient { public static void main(String[] args) { Facade facade = new Facade(); facade.provideMthod(); }}复制代码
运行结果:
子系统A方法A子系统B方法B复制代码
优点
(1)对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起 来更加容易。
(2)实现了子系统与客户端之间的松耦合关系。
(3)子系统之间相对独立。
缺点
(1)增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
(2)不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减 少了可变性和灵活 性。
适用场景
(1)需要为访问一系列复杂的子系统提供一个简单入口时。
(2)个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解 耦,从而提高子系统的独立性和可移植性。