美文网首页
外观模式

外观模式

作者: wuchao226 | 来源:发表于2021-06-28 14:34 被阅读0次

外观模式定义与特点

外观模式又叫作门面(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()被调用!

相关文章

网友评论

      本文标题:外观模式

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