美文网首页
外观模式

外观模式

作者: 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