暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

设计模式【9】-- 外观模式?没那么高大上!

秦怀杂货店 2021-12-14
223
  • 💻   剑指Offer & LeetCode刷题仓库:https://github.com/Damaer/CodeSolution
  • 📒   编程知识库:https://github.com/Damaer/Coding
    • 文档地址:https://damaer.github.io/Coding/#/
1

开局一张图,剩下全靠写...

1外观模式是什么

外观模式,其实是用来隐藏系统的复杂性的,屏蔽掉了背后复杂的逻辑,向用户提供简单的可以访问系统的接口,也是属于结构型模式的一种 。

举个例子,比如我们的Java
三层MVC
架构,对外提供的是controller
,但是controller
内部可能调用了很多service
,service
又调用了一些mapper
,反正就是内部很复杂,但是对外只是一个接口,一个门面,外部看起来是简单的,外观很好看,实际上,你都懂。

再举个栗子,我们用的电脑,其实内部也是极其复杂的,但是我们操作的时候,已经不管内存,cpu,磁盘,显卡这些怎么工作了,甚至更加底层还有二进制,硬件之类的,我们只需要开机,做我们想做的事情,比如Ctrl+C
,Ctrl+V
,在美丽漂亮的界面上操作就可以了。

外观模式的角色

外观模式主要包括几个角色:

  • 外观角色:糅合多个子系统功能,对外提供一个共同的接口
  • 子系统的角色:实现系统的部分功能
  • 客户角色:通过外观角色访问各个子系统的功能

优点与缺点

优点:

  • 减少系统依赖,这里指的是对外的系统依赖
  • 提高灵活性
  • 提高安全性

缺点:

  • 把东西糅合到一个人身上,带来未知的风险
  • 增加新的子系统可能需要修改外观类或者客户端的源代码,违反了“开闭原则”

2测试例子

我们以电脑为例子,先给电脑的每个部件抽象定义成为一个组件,赋予一个work()
的方法:

public interface Component {
    public void work();
}

再定义内存,磁盘,cpu三种不同组件,分别实现上面的接口,各自工作:

public class Disk implements Component{
    @Override
    public void work() {
        System.out.println("磁盘工作了...");
    }
}

public class CPU implements Component{
    @Override
    public void work() {
        System.out.println("CPU工作了...");
    }
}


public class Memory implements Component{
    @Override
    public void work() {
        System.out.println("内存工作了...");
    }
}

然后以上组件可能是交叉在一起工作的,我们模拟一下开机过程,操作系统分别调用他们:

public class OperationSystem {
    private Component disk;
    private Component memory;
    private Component CPU;

    public OperationSystem() {
        this.disk = new Disk();
        this.memory = new Memory();
        this.CPU = new CPU();
    }

    public void startingUp(){
        System.out.println("准备开机...");
        disk.work();
        memory.work();
        CPU.work();
    }
}

而使用人调用的其实是操作系统的开机启动方法,不会直接调用到内部的方法,也就是屏蔽掉了所有的细节:

public class PersonTest {
    public static void main(String[] args) {
        OperationSystem operationSystem = new OperationSystem();
        operationSystem.startingUp();
    }
}

执行结果如下:

准备开机...
磁盘工作了...
内存工作了...
CPU工作了...

最后简单小结一下,外观模式,可以成为门面模式,也就是屏蔽掉内部细节,只对外提供接口,实现所需的功能,内部功能可能很复杂,以上我们模拟的只是简单操作。学会了么?


【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,Redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。

平日时间宝贵,只能使用晚上以及周末时间学习写作,关注我,我们一起成长吧~

 刷题仓库:CodeSolution
 架构实战场景面试题
 2020年我写了什么?
 剑指Offer系列文章
 JVM学习之路
 设计模式
 Java基础点点滴滴
 Mybatis学习之路
● Java集合源码分析系列
● 面试官说:你来设计一个短链接生成系统吧
● LeetCode刷题



文章转载自秦怀杂货店,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论