外观模式

195 阅读1分钟

定义

为子系统中的一组接口提供一个统一的入口。

角色

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)个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解 耦,从而提高子系统的独立性和可移植性。