毅四捕Go设计模式笔记——外观模式

外观模式(Facade Pattern)

为了解决什么问题?

外观模式解决了客户端与复杂子系统间的耦合问题,简化了客户端与复杂系统的交互。

当子系统越来越复杂,具有大量的类和关系时,客户端如何简单地使用子系统就变得很困难。外观模式提供了一个统一的高层接口,让子系统更易于使用。

怎么用代码实现?

下面是Java代码示例,先定义子系统类及方法:

java 复制代码
/**
 * 子系统角色
 */
class SubSystemOne {
    public void methodOne() {
        System.out.println("SubSystemOne Method");
    }
}

class SubSystemTwo {
    public void methodTwo() {
        System.out.println("SubSystemTwo Method");
    }
}

class SubSystemThree {
    public void methodThree() {
        System.out.println("SubSystemThree Method");
    }
}

接着,定义外观类,将子系统方法进行组合和包装:

java 复制代码
/**
 * 外观角色
 */
class Facade {
    private SubSystemOne one;
    private SubSystemTwo two;
    private SubSystemThree three;
    
    public Facade() {
        one = new SubSystemOne();
        two = new SubSystemTwo();
        three = new SubSystemThree();
    }
    
    public void methodA() {
        System.out.println("\nMethodA() ---- ");
        one.methodOne();
        two.methodTwo();
    }
    
    public void methodB() {
        System.out.println("\nMethodB() ---- ");
        two.methodTwo();
        three.methodThree();
    }
}

最后,使用时调用外观类包装的方法即可:

java 复制代码
/**
 * 客户端代码
 */
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.methodA();
        facade.methodB();
    }
}

为什么可以解决这个问题?

外观模式通过引入一个外观角色来隐藏系统的复杂性,并且可以有选择地暴露接口。客户端只需要与外观角色进行交互,而不必关心子系统的具体实现。这减少了系统的复杂性,并有利于降低客户代码与子系统之间的耦合度。

外观模式适用于哪些场景?

为复杂的模块或子系统提供外部访问的接口:通过使用外观角色,用户不需要直接访问复杂的内部子系统。

客户端与多个子系统间的交互:当需要用到多个子系统的功能时,外观模式可以设计一个简化的接口来提供给客户端使用。

分层结构:在多层结构的系统中,可以用外观模式作为每个层的入口点,这样可以简化层间的通信。

外观模式在开源代码的实际应用案例有:

Java数据库连接(JDBC):在JDBC中,有一组API让客户端可以轻松地与数据库交互。这些API内部实际上对数据库驱动及管理进行了封装,降低了客户端操作数据库的复杂性。

Apache Commons Logging:这个日志库为各种不同的日志实现提供了一个统一的接口。它充当外观,隐藏了底层日志API复杂性,比如log4j、JUL(java.util.logging)等。

外观模式不仅减少了已有的系统与客户端的依赖,简化了系统结构,还给子系统的变化留出了空间。通过依赖外观接口,即使子系统内部改动,只要外观接口保持不变,客户端代码不需要做出任何改动。这是一种对已有系统进行重构和升级的常见模式。

---------------------------------这是分割线---------------------------------

欢迎添加博主vx深入交流:

相关推荐
kdxiaojie7 小时前
Linux USB驱动阅读笔记(1)
linux·笔记·学习·usb
Buke..7 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法
半生过往7 小时前
前端学 Java 课程笔记
java·前端·笔记
九硕智慧建筑一体化厂家7 小时前
楼宇自控|智慧建筑核心引擎!楼宇自控系统,赋能建筑高效低碳运维
运维·人工智能·笔记·智慧城市
mmsx8 小时前
基于 Android 的校园信息管理系统源码
android·java·okhttp
Buke..8 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(上):Frida 反调试绕过与 unidbg 调用
java·开发语言·爬虫·python·安卓
竹枝溪8 小时前
Tomcat与Servlet全套小白教程
java·servlet·tomcat·cookie·filter·session·listener
GGMM7898 小时前
施耐德 VX5A1HC90110(VX5A1HD9011)ATV61/ATV71 90‑110KW 电源驱动板详解
笔记·变频器·变频器维修
UseLessQQ9 小时前
云计算k8s集群部署
java·kubernetes·云计算
我命由我123459 小时前
人脸识别 - 人脸识别选帧
java·人工智能·python·算法·安全·java-ee·人脸识别