• 详解设计模式:外观模式


    外观模式(Facade Pattern),又称为门面模式,是 GoF 的 23 种设计模式中的一种结构型设计模式。

    外观模式 是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。

    本篇内容包括:关于外观模式、外观模式实现 Demo



    一、关于外观模式

    1、关于外观模式

    外观模式(Facade Pattern),又称为门面模式,是 GoF 的 23 种设计模式中的一种结构型设计模式。

    外观模式 是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。

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

    2、关于外观模式的构成

    外观模式一般包含三种角色:

    • 外观(Facade)角色:为多个子系统对外提供一个共同的接口,IService。
    • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它,ServiceImpl。
    • 客户(Client)角色:通过一个外观角色访问各个子系统的功能,Controller。
    3、关于外观模式的XML

    在这里插入图片描述

    4、关于外观模式优缺点

    # 外观模式优点

    • 减低了子系统与客户端之间的耦合性,子系统的代码改变不会影响到客户端。这就是为啥天天说业务逻辑要放在 Serivce 实现层了,不仅仅是因为事务,改 Service 不会影响 Cotroller(假设多处地方调用该方法的情况下,除非你把方法参数和返回类型改了,这完全相当于删方法重写了不考虑);
    • 提高了代码的灵活性;
    • 提高了系统的安全性。

    # 外观模式缺点

    • 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

    二、外观模式实现 Demo

    # SubSystem 子系统

    public class SubSystemA {
        public void methodA(){
    
        }
    }
    public class SubSystemB {
        public void methodB(){
    
        }
    }
    public class SubSystemC {
        public void methodC(){
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    # Facade 外观类

    public class Facade {
        private SubSystemA obj1=new SubSystemA();
        private SubSystemB obj2=new SubSystemB();
        private SubSystemC obj3=new SubSystemC();
    
        public void method(){
            obj1.methodA();
            obj2.methodB();
            obj3.methodC();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    # Client 客户端

    public class Client {
        public static void main(String[] args) {
            Facade facade=new Facade();
            facade.method();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    zzy-project-cli,提供多个框架的脚手架
    Kafka和RabbitMQ的对比
    有趣的opencv-记录图片二值化和相似度实现
    动态负载均衡
    为啥不建议使用Select *
    SpringBoot基础知识
    java系列之 页面打印出 [object Object],[object Object]
    C#操作PPT动画窗格并插入音频文件的一些思路
    js的增删改查
    windows 搭建elasticsearch环境
  • 原文地址:https://blog.csdn.net/weixin_45187434/article/details/128110295