设计模式之十外观模式(结构型)_第1页
设计模式之十外观模式(结构型)_第2页
设计模式之十外观模式(结构型)_第3页
设计模式之十外观模式(结构型)_第4页
设计模式之十外观模式(结构型)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计模式之⼗外观模式(结构型)前⾔:外观模式(FacadeDesignPattern)亦称:门⾯模式、Facade,是⼀种结构型设计模式,能为程序库、框架或其他复杂类提供⼀个简单的接⼝。外观类为包含许多活动部件的复杂⼦系统提供⼀个简单的接⼝。与直接调⽤⼦系统相⽐,外观提供的功能可能⽐较有限,但它却包含了客户端真正关⼼的功能。如果你的程序需要与包含⼏⼗种功能的复杂库整合,但只需使⽤其中⾮常少的功能,那么使⽤外观模式会⾮常⽅便,--GoF的《设计模式》定义:提供⼀组统⼀的接⼝,定义⼀组⾼层接⼝让⼦系统更易⽤。⽬录⼀、结构⼆、代码实现复杂视频转换库的简单接⼝:12/***@Description:视频⽂件3*4*@AuthorHJW*@Date2021/4/22*@VersionV1.0**/5678publicclassVideoFile{privateStringname;privateStringcodecType;9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960publicVideoFile(Stringname){=name;this.codecType=name.substring(name.indexOf(".")+1);}publicStringgetCodecType(){returncodecType;}publicStringgetName(){returnname;}}/***@Description:编码格式标记接⼝**@AuthorHJW*@Date2021/4/22*@VersionV1.0**/publicinterfaceCodec{}/***@Description:TODO**@AuthorHJW*@Date2021/4/22*@VersionV1.0**/publicclassMPEG4CompressionCodecimplementsCodec{publicStringtype="mp4";}/***@Description:TODO**@AuthorHJW*@Date2021/4/22*@VersionV1.0**/publicclassOggCompressionCodecimplementsCodec{publicStringtype="ogg";}616263646566676869707172737475767778798081828384858687888990919293949596979899/***@Description:⽂件编码⼯⼚**@AuthorHJW*@Date2021/4/22*@VersionV1.0**/publicclassCodecFactory{publicstaticCodecextract(VideoFilefile){Stringtype=file.getCodecType();if(type.equals("mp4")){System.out.println("CodecFactory:extractingmpegaudio...");returnnewMPEG4CompressionCodec();}else{System.out.println("CodecFactory:extractingoggaudio...");returnnewOggCompressionCodec();}}}/***@Description:TODO*@AuthorHJW*@Date2021/4/22*@VersionV1.0**/publicclassBitrateReader{publicstaticVideoFileread(VideoFilefile,Codeccodec){System.out.println("BitrateReader:readingfile...");returnfile;}publicstaticVideoFileconvert(VideoFilebuffer,Codeccodec){System.out.println("BitrateReader:writingfile...");returnbuffer;}100}101102/**103104105106107*@Description:TODO*@AuthorHJW*@Date2021/4/22*@VersionV1.0**/108publicclassAudioMixer{109publicFilefix(VideoFileresult){110System.out.println("AudioMixer:fixingaudio...");returnnewFile("tmp");111112}113}12/***@Description:TODO3*@AuthorHJW4*@Date2021/4/225*@VersionV1.06**/7publicclassVideoConversionFacade{publicFileconvertVideo(StringfileName,Stringformat){System.out.println("VideoConversionFacade:conversionstarted.");VideoFilefile=newVideoFile(fileName);CodecsourceCodec=CodecFactory.extract(file);CodecdestinationCodec;89101112131415161718192021222324if(format.equals("mp4")){destinationCodec=newOggCompressionCodec();}else{destinationCodec=newMPEG4CompressionCodec();}VideoFilebuffer=BitrateReader.read(file,sourceCodec);VideoFileintermediateResult=BitrateReader.convert(buffer,destinationCodec);Fileresult=(newAudioMixer()).fix(intermediateResult);System.out.println("VideoConversionFacade:conversioncompleted.");returnresult;}}12/***@Description:客户端测试3*4*@AuthorHJW5*@Date2021/4/226*@VersionV1.07**/8publicclassClient{9publicstaticvoidmain(String[]args){1011121314VideoConversionFacadeconverter=newVideoConversionFacade();Filemp4Video=converter.convertVideo("youtubevideo.ogg","mp4");//...}}三、外观模式在MyBatis框架的应⽤MyBatis中的Configuration去创建MetaObject对象使⽤到外观模式12publicclassConfiguration{protectedReflectorFactoryreflectorFactory=newDefaultReflectorFactory();protectedObjectFactoryobjectFactory=newDefaultObjectFactory();protectedObjectWrapperFactoryobjectWrapperFactory=newDefaultObjectWrapperFactory();3456publicMetaObjectnewMetaObject(Objectobject){returnMetaObject.forObject(object,objectFactory,objectWrapperFactory,reflectorFactory);}789101112131415161718192021222324252627282930}publicclassMetaObject{privateMetaObject(Objectobject,ObjectFactoryobjectFactory,ObjectWrapperFactoryobjectWrapperFactory,ReflectorFactoryreflectorFactory)this.originalObject=object;this.objectFactory=objectFactory;this.objectWrapperFactory=objectWrapperFactory;this.reflectorFactory=reflectorFactory;if(objectinstanceofObjectWrapper){this.objectWrapper=(ObjectWrapper)object;}elseif(objectWrapperFactory.hasWrapperFor(object)){this.objectWrapper=objectWrapperFactory.getWrapperFor(this,object);}elseif(objectinstanceofMap){this.objectWrapper=newMapWrapper(this,(Map)object);}elseif(objectinstanceofCollection){this.objectWrapper=newCollectionWrapper(this,(Collection)object);}else{this.objectWrapper=newBeanWrapper(this,object);}}四、外观模式适合应⽤场景如果需要⼀个指向复杂⼦系统的直接接⼝,且该接⼝的功能有限,则可以使⽤外观模式。⼦系统通常会随着时间的推进变得越来越复杂。即便是应⽤了设计模式,通常你也会创建更多的类。尽管在多种情形中⼦系统可能是更灵活或易于复⽤的,但其所需的配置和样板代码数量将会增长得更快。为了解决这个问题,外观将会提供指向⼦系统中最常⽤功能的快捷⽅式,能够满⾜客户端的⼤部分需求。如果需要将⼦系统组织为多层结构,可以使⽤外观。创建外观来定义⼦系统中各层次的⼊⼝。可以要求⼦系统仅使⽤外观来进⾏交互,以减少⼦系统之间的耦合。解决易⽤性问题门⾯模式可以⽤来封装系统的底层实现,隐藏系统的复杂性,提供⼀组更加简单易⽤、更⾼层的接⼝。解决性能问题假设,完成某个业务功能需要“依次”调⽤a、b、d三个接⼝,因⾃⾝业务的特点,不⽀持并发调⽤这三个接⼝。如果我们现在发现App客户端的响应速度⽐较慢,排查之后发现,是因为过多的接⼝调⽤过多的⽹络通信。针对这种情况,我们就可以利⽤门⾯模式,让后端服务器提供⼀个包裹a、b、d三个接⼝调⽤的接⼝x。App客户端调⽤⼀次接⼝x,来获取到所有想要的数据,将⽹络通信的次数从3次减少到1次,也就提⾼了App的响应速度。解决分布式事务问题⽀持两个接⼝调⽤在⼀个事务中执⾏,是⽐较难实现的,这涉及分布式事务问题。虽然我们可以通过引⼊分布式事务框架或者事后补偿的机制来解决,但代码实现都⽐较复杂。⽽最简单的解决⽅案是,利⽤数据库事务或者Spring框架提供的事务(如果是Java语⾔的话),在⼀个事务中,执⾏创建⽤户和创建钱包这两个SQL操作。这就要求两个SQL操作要在⼀个接⼝中完成,所以,我们可以借

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论