• 外观(门面)模式


    思考外观模式

    正常完成一个功能需要调很多个接口,外观模式就是组装这些接口为一个接口,对外提供这一个接口,用户调用这一个接口就能完成原来多个接口才能完成的功能,让客户端与子系统之间实现了解耦,简化调用

    1.外观模式的本质

    外观模式的本质是:封装交互,简化调用。

    门面模式的本质是提供一个统一的接口,封装一组复杂的子系统或组件,使其对客户端呈现出一个简单的界面。它通过引入一个门面类(Facade Class)作为客户端与子系统之间的中间层,将客户端的请求委派给相应的子系统进行处理。

    门面模式的本质是通过封装复杂性,隐藏系统的内部复杂结构和实现细节,提供一个简单易用的接口给客户端。它在设计上追求简单性和易用性,使得客户端能够更加方便地使用系统的功能,同时实现了客户端与子系统之间的松耦合关系。

    门面模式的关键是门面类,它充当了一个入口点的角色。门面类封装了一系列子系统的功能,负责协调子系统的交互,并提供一个高层次的接口给客户端使用。客户端只需与门面类进行交互,而无需直接与子系统进行交互,从而降低了客户端的复杂性。

    通过使用门面模式,可以实现系统的简化、松耦合、封装复杂性和支持分层架构等优点。它是一种结构型设计模式,常用于大型系统或复杂的软件系统中,以提供更好的可维护性、可扩展性和易用性。

    2.何时选用外观模式

    建议在如下情况时选用外观模式。

    • 当需要为复杂的子系统提供一个简单易用的接口,以方便客户端进行操作时,门面模式非常有用。门面类可以封装一系列复杂的操作,将其转化为简单的接口方法,使得客户端能够更加方便地使用子系统的功能。

    • 当需要构建分层架构的系统时,门面模式可以用于定义每个层级的接口。每个层级可以有一个门面类,用于与上一层级进行交互,并隐藏下一层级的细节。这样可以有效地划分系统的职责,提高系统的可维护性和可扩展性。

    总而言之,门面模式适用于需要简化复杂系统、实现松耦合、提供简单接口或支持分层架构的情况。它可以将复杂性封装起来,提供一个简单统一的接口,使得系统更易用、更灵活。

    3.优缺点

    外观模式有如下优点

    • 提供简单接口
      当需要为复杂的子系统提供一个简单易用的接口,以方便客户端进行操作时,门面模式非常有用。门面类可以封装一系列复杂的操作,将其转化为简单的接口方法,使得客户端能够更加方便地使用子系统的功能。

    • 支持分层架构
      当需要构建分层架构的系统时,门面模式可以用于定义每个层级的接口。每个层级可以有一个门面类,用于与上一层级进行交互,并隐藏下一层级的细节。这样可以有效地划分系统的职责,提高系统的可维护性和可扩展性。

    外观模式有如下缺点

    • 增加了一个额外的抽象层
      引入门面类会增加系统的复杂性,因为需要额外的抽象层来封装子系统的功能。这可能会导致一定的性能损失,特别是在对性能要求较高的系统中。

    • 不适合过于简单的系统
      如果系统本身非常简单,并且不存在复杂的子系统或组件,使用门面模式可能会引入不必要的复杂性。在这种情况下,直接与系统进行交互可能更加简单和高效。

    4.外观模式的结构

    在这里插入图片描述

    5.实现

    模拟代码生成使用的外观模式
    在这里插入图片描述

    public class ControllerGenerate {
    
        public void generate(){
            System.out.println("controller层代码生成");
        }
    }
    
    public class ServiceGenerate {
    
        public void generate(){
            System.out.println("service层代码生成");
        }
    }
    
    public class DaoGenerate {
    
        public void generate(){
            System.out.println("dao层代码生成");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    门面类

    public class Facade {
    
    	//组装各个方法
        public static void generate(){
            ControllerGenerate controllerGenerate = new ControllerGenerate();
            ServiceGenerate serviceGenerate = new ServiceGenerate();
            DaoGenerate daoGenerate = new DaoGenerate();
            controllerGenerate.generate();
            serviceGenerate.generate();
            daoGenerate.generate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试

    public class FacadeTest {
    
        /**
         * 模拟代码生成过程
         * 1.生成controller层
         * 2.生成service层
         * 3.生成dao层
         * @param args
         */
        public static void main(String[] args) {
            ControllerGenerate controllerGenerate = new ControllerGenerate();
            ServiceGenerate serviceGenerate = new ServiceGenerate();
            DaoGenerate daoGenerate = new DaoGenerate();
            controllerGenerate.generate();
            serviceGenerate.generate();
            daoGenerate.generate();
    
            System.out.println("--------------------------------");
    
            Facade.generate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    奇异值和零空间
    树莓派4B(Pi buster)一键安装apt存在问题,WARNING: apt does not have a stable CLI interface
    python扫描微信QQ二维码
    什么是哲学?《哲学家们都干了些什么?》读后感
    Biotin-PEG-CHO,生物素PEG醛基
    链表完成栈模拟和栈模拟计数器原理
    java-net-php-python-jsp基于JavaWeb的医药公司销售系统的设计与实现计算机毕业设计程序
    VSCode编写OpenCV
    23种设计模式-单例设计模式介绍带实战
    多卡片效果悬停效果
  • 原文地址:https://blog.csdn.net/qq_42665745/article/details/127874346