外观模式

2021-06-28  本文已影响0人  wuchao226

外观模式定义与特点

外观模式又叫作门面(Facade)模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观(Facade)模式是迪米特法则的典型应用,它有以下主要优点。

外观(Facade)模式的主要缺点如下。

外观模式使用场景

  1. 为复杂子系统提供一个接口,使得耦合大大降低。在开发阶段,子系统往往因为不断的重构演化变得越来越复杂,大多数的模式使用时也会产生很多很小的类,给外部调用它们的用户程序带来了使用上的困难,增加外观模式可以提供一个简单的接口,减少它们之间的依赖。
  2. 在维护一个遗留的大型系统时,可能这个系统以及难以维护和扩展了,但新需求开发必须依赖于它。此时可以为新系统开发一个外观 Facade 类,为设计粗糙或高度复杂的遗留代码设计比较清晰的简单的接口,让新系统与 Facade 对象交互,Facade 与遗留代码交互多远复杂的工作

外观模式的 UML 类图

/**
 * 子系统角色
 */
public class SubSystemOne {
    public void methodOne() {
        System.out.println("子系统01的 methodOne()被调用!");
    }
}

/**
 * 子系统角色
 */
public class SubSystemTwo {
    public void methodTwo() {
        System.out.println("子系统02的 methodTwo()被调用!");
    }
}

/**
 * 子系统角色
 */
public class SubSystemThree {
    public void methodThree() {
        System.out.println("子系统03的 methodThree()被调用!");
    }
}

/**
 * 子系统角色
 */
public class SubSystemFour {
    public void methodFour() {
        System.out.println("子系统04的 methodFour()被调用!");
    }
}


/**
 * 外观类
 */
public class Facade {

    private SubSystemOne subSystemOne;
    private SubSystemTwo subSystemTwo;
    private SubSystemThree subSystemThree;
    private SubSystemFour subSystemFour;

    public Facade() {
        subSystemOne = new SubSystemOne();
        subSystemTwo = new SubSystemTwo();
        subSystemThree = new SubSystemThree();
        subSystemFour = new SubSystemFour();
    }

    public void methodA() {
        System.out.println("方法组A---------");
        subSystemOne.methodOne();
        subSystemTwo.methodTwo();
        subSystemFour.methodFour();
    }

    public void methodB() {
        System.out.println("方法组B---------");
        subSystemTwo.methodTwo();
        subSystemThree.methodThree();
    }
}


/**
 * 客户类
 */
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.methodA();
        facade.methodB();
    }
}

程序运行结果如下:

方法组A---------
子系统01的 methodOne()被调用!
子系统02的 methodTwo()被调用!
子系统04的 methodFour()被调用!
方法组B---------
子系统02的 methodTwo()被调用!
子系统03的 methodThree()被调用!
上一篇 下一篇

猜你喜欢

热点阅读