美文网首页Java设计模式
设计模式——外观模式

设计模式——外观模式

作者: Ant_way | 来源:发表于2018-06-12 16:49 被阅读0次

阎宏博士的《JAVA与模式》一书中开头是这样描述外观(Facade)模式的:
门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

外观模式(Facade模式)也叫门面模式,通过外观类的包装,将复杂的系统通过封装提供简单的接口供客户端使用,以便降低客户端的使用复杂度。外观模式Facade类提供一个上层接口,集成封装了各个子系统的方法供客户端使用。客户端只需要直接与外观角色交互,客户端与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。

在上面我们也提到了外观类的定义,将复杂的众多子系统接口进行封装提供简单接口供客户端使用,这个跟我们在实际的开发过程中遇到的工具类很相似,这里就介绍下外观类、工具类、示例类。

  • 一个外观就是一个类,它包含的功能介于工具包与完整的应用程序之间,为工具包或子系统的类提供了简单的用法;
  • 工具类:Java类库中的类,这些类的方法全是静态方法;
  • 示例类:一个完整的应用程序;

外观模式由两大角色组成:

  • 外观类(Facade):封装子系统接口供客户端使用;
  • 子系统角色(SubSystem):可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如上面的子系统就是由ModuleA、ModuleB、ModuleC三个类组合而成)。每个子系统都可以被客户端直接调用,或者被门面角色调用。

UML图

Facade.png

示例代码:
子系统

/**
 * 子类系统A
 * @author Iflytek_dsw
 *
 */
class SubSystemA{
    public void createA(){
        System.out.println("createA()");
    }
    
    public void drawSystemA(){
        System.out.println("drawSystemA()");
    }
}
/**
 * 子类系统B
 * @author Iflytek_dsw
 *
 */
class SubSystemB{
    public void createB(){
        System.out.println("createA()");
    }
    
    public void drawSystemB(){
        System.out.println("SubSystemB()");
    }
}

外观类

/**
 * 外观类,用于抽象子类接口
 * @author Iflytek_dsw
 *
 */
public class FacadeMaker {
    private SubSystemA subSystemA;
    private SubSystemB subSystemB;
    
    public FacadeMaker(){
        subSystemA = new SubSystemA();
        subSystemB = new SubSystemB();
    }
    
    
    public void createAndDrawA(){
        subSystemA.createA();
        subSystemA.drawSystemA();
    }
    
    
    public void createAndDrawB(){
        subSystemB.createB();
        subSystemB.drawSystemB();
    }
}

客户端

public class Client {
    
    public static void main(String []args){
        FacadeMaker facadeMaker = new FacadeMaker();
        facadeMaker.createAndDrawA();
        facadeMaker.createAndDrawB();
    }
}

外观模式总结

优点

  • 减少系统相互依赖。通过Facade类的封装,降低了客户端系统与子系统的耦合,使子系统更加独立,容易维护。
  • 简单易用,让客户端更加简单使用系统,不必了解系统内部的实现。
  • 通过合理使用Facade,可以帮助我们更好的划分访问的层次。针对客户端的需求,暴露或隐藏子系统的实现细节。

缺点

  • 不符合开闭原则。这里当增加新的子系统或者移除子系统时需要修改外观类,可以通过引入抽象外观类在一定程度上解决该问题,客户端针对抽象外观类进行编程

相关文章

  • Android设计模式——外观模式(七大结构型)

    1.外观模式介绍 外观模式(Facade Pattern),是七大结构型设计模式之一。 外观模式运...

  • 设计模式[9]-外观模式-Facade Pattern

    1. 外观模式 外观模式(Facade Pattern),又称为门面模式,是非常常用的结构性设计模式。外观模式使得...

  • java设计模式-外观模式(Facade)

    外观模式,属于结构性模式。属于设计模式里面比较简单的设计模式,本人认为是最简单的设计模式。 所谓外观,就是我们能看...

  • 了解外观模式

    java 设计模式 ------外观模式 Java中一共有23种设计模式,每种设计模式各有特...

  • 设计模式之-4.外观模式

    每看一次设计模式,感觉每一个设计模式看起来是那么简单,对于外观模式我的理解就是外观模式:外观模式,这个名字起得不怎...

  • 设计模式详解——外观模式

    本篇文章介绍一种设计模式——外观模式。本篇文章内容参考《JAVA与模式》之门面模式,外观模式,深入浅出外观模式(二...

  • 外观模式(Facede)

    本文参考自: 《JAVA设计模式》之外观模式(Facade) 1. 作用 外观模式也叫门面模式,门面模式是对象的结...

  • 设计模式---外观模式

    1、外观模式(Facade):也叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个...

  • 设计模式——外观模式

    阎宏博士的《JAVA与模式》一书中开头是这样描述外观(Facade)模式的:门面模式是对象的结构模式,外部与一个子...

  • 设计模式--外观模式

    一、举个栗子小明每天回家都会先打开灯,空气净化器,电热水器烧上水,放上音乐,如果天气热的话,再打开空调。写成代码 ...

网友评论

    本文标题:设计模式——外观模式

    本文链接:https://www.haomeiwen.com/subject/qnlreftx.html