外观模式

随着一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

定义

外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

结构与实现

外观模式提供了一个访问子系统的接口,除了这个接口不允许访问子系统。
类图
外观模式_第1张图片
1、外观模式的结构

  • Facade门面角色
    客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,也就说该角色没有实际的业务逻辑,只是一个委托类。
  • subsystem子系统角色
    可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在。对于子系统而言,门面仅仅是另外一个客户端而已。
    2、实现
public class ClassA {
    public void doSomething() {
        System.out.println("子系统01的method被调用!");
    }
}
public class ClassB {
    public void doSomething() {
        System.out.println("子系统02的method被调用!");
    }
}
public class ClassC {
    public void doSomething() {
        System.out.println("子系统03的method被调用!");
    }
}
public class Facade {
    private ClassA classA = new ClassA();
    private ClassB classB = new ClassB();
    private ClassC classC = new ClassC();
    public void method() {
        classA.doSomething();
        classB.doSomething();
        classC.doSomething();
    }
}
public class Client {
    public static void main(String[] args) {
        Facade f = new Facade();
        f.method();
    }
}

输出:
外观模式_第2张图片

优缺点

优点:

  • 减少系统的相互依赖
  • 提高灵活性
  • 提高安全性

缺点:

  • 不符合开闭原则,对修改关闭,对扩展开放。
  • 不能很好地限制客户使用子系统类。

你可能感兴趣的:(设计模式)