10,外观模式

一,概念

Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。

二,例子

结构

三个要素

子系统角色(Subsystem classes):功能提供者。指提供功能的类群(模块或子系统)。

外观角色(Facade):为调用方定义简单的调用接口。是模式的核心,他被客户client角色调用,知道各个子系统的功能。同时根据客户角色已有的需求预订了几种功能组合。

客户角色(Clients):调用者。通过Facade接口调用提供某功能的内部类群。

子系统角色(Subsystem classes):SystemA,SystemB,SystemC

/**
 * 
 * @类名称:SystemA
 * @类描述:子系统角色(Subsystem classes)
 * @创建人:zender
 */
public class SystemA {
    /*
     * A子系统实现功能
     */
    public void doSomething() {
        System.out.println("实现A子系统功能");
    }
}
/**
 * 
 * @类名称:SystemB
 * @类描述:子系统角色(Subsystem classes)
 * @创建人:zender
 */
public class SystemB {
    /*
     * B子系统实现功能
     */
    public void doSomething() {
        System.out.println("实现B子系统功能");
    }
}
/**
 * 
 * @类名称:SystemC
 * @类描述:子系统角色(Subsystem classes)
 * @创建人:zender
 */
public class SystemC {
    /*
     * C子系统实现功能
     */
    public void doSomething() {
        System.out.println("实现C子系统功能");
    }
}

外观角色(Facade):SystemFacade

/**
 * 
 * @类名称:SystemFacade
 * @类描述:外观角色(Facade)
 * @创建人:zender
 */
public class SystemFacade {
    private SystemA systemA;
    private SystemB systemB;
    private SystemC systemC;
    
    public SystemFacade() {
        this.systemA = new SystemA();
        this.systemB = new SystemB();
        this.systemC = new SystemC();
    }
    
    public void doABC() {
        this.systemA.doSomething();
        this.systemB.doSomething();
        this.systemC.doSomething();
    }
    
    public void doAB() {
        this.systemA.doSomething();
        this.systemB.doSomething();
    }
}

客户角色(Clients):SystenClients

/**
 * 
 * @类名称:SystenClients
 * @类描述:客户角色(Clients)
 * @创建人:zender
 */
public class SystenClients {
    public static void main(String[] args) {
        // 由于Facade的作用,客户端可以根本不知道子系统类的存在
        SystemFacade sf = new SystemFacade();
        sf.doABC();
        System.out.println("....................");
        sf.doAB();
    }
}

结果

三、优点缺点

1,优点

Facade模式降低了客户端对子系统使用的复杂性。

外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

通过合理使用Facade,可以帮助我们更好的划分访问的层次。

2,缺点

   过多的或者是不太合理的Facade也容易让人迷惑,到底是调用Facade好呢,还是直接调用模块好。

四,适用场景

1,需要将设计进行分层时考虑Facade模式。

2,在开发阶段,子系统往往因为重构变得越来越复杂,增加外观模式可以提供一个简单的接口,减少它们之间的依赖。

3,在维护一个遗留的大型系统时,可以这个系统已经非常难以维护和扩展,可以为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

原文地址:https://www.cnblogs.com/Zender/p/7503710.html