当前位置: 首页 > news >正文

设计模式(八)_门面模式

今天一看日期,我擦,已经7月中旬了,抓紧时间学习起来。这个月要把设计模式结束掉,因为需要学习的东西太多了

为什么今天学习这个模式呢,因为最近在看log4j2,然后看到了阿里规约中有关日志的规约中写到:

应用中不可直接使用日志系统 (Log 4 j 、 Logback) 中的 API ,而应依赖使用日志框架
SLF 4 J 中的 API ,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

概念

门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用

门面模式有的地方也称为外观模式

例子

看了上面概念,我想门面模式应该这个样子,以日志系统为例

image

咱们再找找其他人如何表示的
image

不得不佩服大牛,不仅技术强,画图也比我画的好!咱们还是先从简单的例子中理解下,路要一步一步走的。这篇主要以门面模式为主


代码示例

找个简单的例子,这个例子很形象,保证你看了之后绝对能记住

身为程序员,第一件事情就是来了开电脑,只要按下开机键。其实电脑内部实际上也启动了多个模块,如cpu、硬盘、内存等等

image

开机键就是一个很好的门面,让程序员无需了解cpu,内存和硬盘如何启动。


public class Cpu {
    
    public void start() {
        System.out.println("cpu启动了");
    }

}

public class Disk {
    
    public void start() {
        System.out.println("硬盘启动了");
    }
}

public class Memory {
    
    public void start() {
        System.out.println("内存启动了");
    }

}

如果没有开机键,我们需要这么做:

        new Cpu().start();
        new Disk().start();
        new Memory().start();
        

有了开机键,这些操作都交给开机键去做

public class StartBtn {
    
    public void start() {
        new Cpu().start();
        new Disk().start();
        new Memory().start();
    }

}

我们只需要

new StartBtn().start();

门面模式不仅为我们提供了一个简单方便的接口,也让我们的系统和子系统解耦。

总结

门面模式主要使用场景:

  • 包装多个复杂的子系统,提供一个简单的接口
  • 重新包装系统,隐藏不想暴露的接口

优缺点

将复杂的接口简单化,减少了客户端与接口之间的耦合,提高了安全性。可能产生大量的中间类(门面类),一定程度上增加了系统的复杂度

转载于:https://www.cnblogs.com/zhenghengbin/p/9304124.html

相关文章:

  • centos 中文乱码解决办法
  • Confluence 6 WebDAV 禁用严格路径检查
  • 并查集——向量偏移
  • 洛谷P3952 时间复杂度
  • XSS Filter Evasion Cheat Sheet 中文版
  • 【Android Studio安装部署系列】二十七、Android studio修改项目名称和包名
  • awk编程
  • 24. 两两交换链表中的节点
  • 如何使Python完美升级到新版本
  • 子集
  • 源码编译安装LNMP环境及配置基于域名访问的多虚拟主机
  • Linux各目录及每个目录的详细介绍
  • 90分 蓝桥杯 算法提高 道路和航路 [ 最短路 ]
  • linux一次卸载多个软件
  • 《大话数据结构》读书笔记(一)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • EOS是什么
  • GraphQL学习过程应该是这样的
  • Leetcode 27 Remove Element
  • Mocha测试初探
  • Service Worker
  • 从重复到重用
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用SAX解析XML
  • 微信开放平台全网发布【失败】的几点排查方法
  • 想使用 MongoDB ,你应该了解这8个方面!
  • hi-nginx-1.3.4编译安装
  • raise 与 raise ... from 的区别
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #在 README.md 中生成项目目录结构
  • (1)bark-ml
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (33)STM32——485实验笔记
  • (floyd+补集) poj 3275
  • (Matlab)使用竞争神经网络实现数据聚类
  • (poj1.3.2)1791(构造法模拟)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (分布式缓存)Redis持久化
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .NET 反射 Reflect
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @JsonSerialize注解的使用
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [docker]docker网络-直接路由模式
  • [FZSZOJ 1223] 上海红茶馆
  • [HDU]2161Primes
  • [IDF]啥?
  • [IE编程] IE8 新增的C++开发接口
  • [IE技巧] IE8中HTTP连接数目的变化