zoukankan      html  css  js  c++  java
  • java设计模式--外观模式

    外观模式:为子系统中的一组接口提供一个一致的界面,该模式定义了一个高层接口,这个接口使这个子系统更加容易使用。

    我们先看一个使用外观模式的例子,首先定义了三个子系统类

    public class SubSystemA {
        public void functionA(){
            System.out.println("子系统A方法");
        }
    }
    
    public class SubSystemB {
        public void functionB(){
            System.out.println("子系统B方法");
        }
    }
    
    public class SubSystemC {
        public void functionC(){
            System.out.println("子系统C方法");
        }
    }

    使用外观模式定义了一个高层接口,这个接口定义了调用子系统的方法

    public interface Facade {
        void methodA();
        void methodB();
        void methodC();
    }

    接口调用子系统的具体实现

    public class FacadeImpl implements Facade {
    
        private SubSystemA subSystemA;
        private SubSystemB subSystemB;
        private SubSystemC subSystemC;
    
        public FacadeImpl(){
            subSystemA = new SubSystemA();
            subSystemB = new SubSystemB();
            subSystemC = new SubSystemC();
        }
        @Override
        public void methodA() {
            System.out.println("methodA");
            subSystemA.functionA();
        }
    
        @Override
        public void methodB() {
            System.out.println("methodB");
            subSystemB.functionB();
            subSystemC.functionC();
        }
    
        @Override
        public void methodC() {
            System.out.println("methodC");
            subSystemA.functionA();
            subSystemC.functionC();
        }
    }

    使用外观模式的调用方法

    public class Test1 {
        public static void main(String[] args) {
            Facade facade = new FacadeImpl();
            facade.methodA();
            facade.methodB();
            facade.methodC();
        }
    }

    执行结果:

    methodA
    子系统A方法
    methodB
    子系统B方法
    子系统C方法
    methodC
    子系统A方法
    子系统C方法

    下面是没有使用外观模式时客户端的调用方法

    public class Test2 {
        public static void main(String[] args) {
            SubSystemA subSystemA = new SubSystemA();
            SubSystemB subSystemB = new SubSystemB();
            SubSystemC subSystemC = new SubSystemC();
    
            subSystemA.functionA();
            System.out.println("----------------");
            subSystemB.functionB();
            subSystemC.functionC();
            System.out.println("----------------");
            subSystemA.functionA();
            subSystemC.functionC();
    
        }
    }

    执行结果:

    子系统A方法
    ----------------
    子系统B方法
    子系统C方法
    ----------------
    子系统A方法
    子系统C方法

      通过对比我们可以发现外观模式定义了一个外观类Facade,这个类了解所有子系统的方法和属性,在其内部进行组合后客户端进行调用,如果不使用外观模式,客户端需要去了解所有子系统中的类和属性,有了外观模式,客户端只需要知道外观类Facade就可以了。

    我们经常使用的三层架构就可以理解为一个外观模式的实例,如果没有service层,我们的controller层就可能需要直接去关联多个dao才能实现功能,这样就会出现多个controller和dao交叉关联,使系统越来越复杂,这时我们就可以抽象出一层service和dao接口使得耦合程

    度降低,除此之外,在维护一个遗留的大型系统时,我们也可以抽象出一个接口,用这个接口去和这个旧系统交互,新系统只需要与外观类交互,这样可以使得代码维护的复杂程度大大降低。

  • 相关阅读:
    spring学习总结003 --- IOC容器启动源码(BeanFactoryPostProcessor)
    spring学习总结002 --- IOC容器启动源码(BeanFactory)
    ubuntu上安装mysql
    kafka学习总结017 --- consumer配置参数之max.poll.interval.ms
    kafka学习总结016 --- consumer配置参数session.timeout.ms和heartbeat.interval.ms
    kafka学习总结015 --- consumer配置参数之auto.offset.reset
    kafka学习总结014 --- consumer多线程问题
    kafka学习总结013 --- kafka消费者API
    kafka学习总结012 --- 数据消费相关流程
    Java SAX解析
  • 原文地址:https://www.cnblogs.com/yimengyizhen/p/11111823.html
Copyright © 2011-2022 走看看