先上图,剩下的靠写……什么是外观模式?外观模式实际上是用来隐藏系统的复杂性,屏蔽背后复杂的逻辑,为用户提供简单的可以访问系统的界面,也是结构模式的一种。比如我们Java的三层MVC架构,外部提供了controller,但是controller内部可能会调用很多service,service又调用了一些mapper。反正内部很复杂,但对外只是一个接口,一个门面,外面看起来简单,外观好看,其实你懂的。再举个例子,我们使用的电脑其实内部是极其复杂的,但是我们在操作的时候,已经不关心内存、cpu、磁盘、显卡是怎么工作的,甚至底层还有二进制和硬件。只要打开它,做我们想做的,比如Ctrl+C,Ctrl+V,在漂亮漂亮的界面上操作。外观模式的角色外观模式主要包括几个角色:外观角色:组合多个子系统的功能,对外提供一个通用的接口子系统角色:实现系统的部分功能客户角色:通过外观获取各个子系统的功能优势角色优缺点:减少系统依赖,这里指的是外部系统依赖提高灵活性,提高安全性缺点:把东西合二为一,带来未知风险增加新的子系统可能需要修改外观类或客户端源代码违反了“开放”-封闭原则”测试示例我们以计算机为例,首先将计算机的各个组件抽象定义为一个组件,并赋值一个work()方法:publicinterfaceComponent{publicvoidwork();}然后定义三个不同的组件:memory,disk,cpu,分别实现以上接口,分别工作:publicclassDiskimplementsComponent{@Overridepublicvoidwork(){System.out.println("磁盘正在工作...");}}publicclassCPUimplementsComponent{@Overridepublicvoidwork(){System.out.println("CPUisworking...");}}publicclassMemoryimplementsComponent{@Overridepublicvoidwork(){System.out.println("Thememoryisworking...");}}那么上面的组件可能会协同工作,我们来模拟启动过程,操作系统分别调用它们:publicclassOperationSystem{privateComponentdisk;私有组件内存;私有组件CPU;publicOperationSystem(){this.disk=newDisk();this.memory=newMemory();this.CPU=newCPU();}publicvoidstartingUp(){System.out.println("准备启动...");磁盘工作();内存.work();CPU.工作();}}用户调用的其实是操作系统启动方法不会直接调用内部方法,也就是屏蔽了所有的细节:publicclassPersonTest{publicstaticvoidmain(String[]args){OperationSystemoperationSystem=新的操作系统();operationSystem.startingUp();}}执行结果如下:readytoboot...磁盘在工作...内存在工作...CPU在工作...最后简单总结一下,外观模式可以变成门面模式,即屏蔽内部细节,只对外提供接口实现需要的功能。内部函数可能非常复杂。我们上面模拟的只是一个简单的操作。你学会了吗?【作者简介】:公众号【秦淮杂货铺】作者秦淮,个人网站:http://aphysia.cn,技术之路非一蹴而就,山高水长江河漫漫,纵然缓慢,也不会停下脚步。剑指全题OfferPDF开源编程笔记
