极客学院 网站建设深圳福田华丰大厦网站建设

张小明 2025/12/31 18:50:52
极客学院 网站建设,深圳福田华丰大厦网站建设,商务网站大全,网站里的动画效果图当我们想对一个类进行功能扩展的时候#xff0c;最简单的方法就是继承该类然后进行修改#xff0c;但是一个接口下的实现类很多#xff0c;每个子类都进行继承扩展的话又会诞生很多子类#xff0c;造成类爆炸的情况。 装饰器模式属于结构型设计模式#xff0c;就可以做到在…当我们想对一个类进行功能扩展的时候最简单的方法就是继承该类然后进行修改但是一个接口下的实现类很多每个子类都进行继承扩展的话又会诞生很多子类造成类爆炸的情况。装饰器模式属于结构型设计模式就可以做到在不改变原代码的情况下完成功能的扩展符合OCP原则也避免了类爆炸的情况。Java中的IO流大量使用了装饰器模式可以参考官方的源码进行学习。在装饰器设计中两个重要角色装饰者与被装饰者装饰器设计模式中要求装饰者与被装饰者应实现同一个接口/同一些接口/继承同一个抽象类因为实现同一个接口以后对于客户端程序来说使用装饰者时就像在使用被装饰者一样装饰者中含有被装饰者的引用A has a B尽量使用has a[耦合度低一些]不要使用is a即组合优于继承原则例如我们想实现一个自己的Set能够记录下被移除的元素有些人可能会想到继承个set但是我们需要注意继承只能单继承这样操作会使该类失去其他继承的资格所以优先还是实现set接口而不影响原本的继承扩展。-HistorySet.javapackageinsight;importjava.util.*;/** * author: wangcai * date: 2025/12/15 */publicclassHistorySetEimplementsSetE{/* 记录Remove掉的元素 */ListEremoveListnewArrayList();finalSetEdelegate;publicHistorySet(SetEdelegate){this.delegatedelegate;}Overridepublicintsize(){returndelegate.size();}OverridepublicbooleanisEmpty(){returndelegate.isEmpty();}Overridepublicbooleancontains(Objecto){returndelegate.contains(o);}OverridepublicIteratoriterator(){returndelegate.iterator();}OverridepublicObject[]toArray(){returnnewObject[0];}Overridepublicbooleanadd(Objecto){returndelegate.add((E)o);}Overridepublicbooleanremove(Objecto){booleanremovedelegate.remove(o);if(remove){removeList.add((E)o);}returnremove;}OverridepublicbooleanaddAll(Collectionc){returnfalse;}Overridepublicvoidclear(){}OverridepublicbooleanremoveAll(Collectionc){returnfalse;}OverridepublicbooleanretainAll(Collectionc){returnfalse;}OverridepublicbooleancontainsAll(Collectionc){returnfalse;}OverridepublicObject[]toArray(Object[]a){returnnewObject[0];}OverridepublicStringtoString(){returnHistorySet{ delegate delegate.toString() removeList removeList.toString() };}}例如上面这样这样可以自己无需实现set的功能就可以具备set的能力。而且支持手动传入set实例由用户自己控制想要扩展的setHashSet或者TreeSet。而如果通过继承实现该扩展功能的话就不能这么灵活我们需要每种实现都单独编写一个扩展类。-Usage.javapackageinsight;importjava.util.HashSet;/** * author: wangcai * date: 2025/12/15 */publicclassUsage{publicstaticvoidmain(String[]args){HistorySetIntegerintegersnewHistorySetInteger(newHashSet());integers.add(1);integers.add(2);integers.add(3);integers.add(4);integers.add(5);integers.remove(2);integers.remove(2);integers.remove(5);System.out.println(integers);}}/* HistorySet{ delegate [1, 3, 4] removeList [2, 5] } */并且我们可以反复的包因为我们实现的本身也是一个set集合还是能作为构造器参数传入。packageinsight;importjava.util.HashSet;/** * author: wangcai * date: 2025/12/15 */publicclassUsage{publicstaticvoidmain(String[]args){HistorySetIntegerintegersnewHistorySet(newHashSet());HistorySetIntegerintegers1newHistorySet(integers);integers1.add(1);integers1.add(2);integers1.add(3);integers1.add(4);integers1.add(5);integers1.remove(2);integers1.remove(2);integers1.remove(5);System.out.println(integers1);}}/* HistorySet{ delegate HistorySet{ delegate [1, 3, 4] removeList [2, 5] } removeList [2, 5] } */我们可以看一下Java中的一些实现Collections.synchronizedCollection()publicstaticTCollectionTsynchronizedCollection(CollectionTc){returnnewSynchronizedCollection(c);}BufferedInputStream我们自己手写一个BufferedInputStream模仿Java IO流中的缓冲输入流来提升读取效率。-Usage.javapackageinsight.input;importjava.io.File;importjava.io.FileInputStream;importjava.time.Instant;/** * author: wangcai * date: 2025/12/16 */publicclassUsage{publicstaticvoidmain(String[]args)throwsException{FilefilenewFile(src/main/resources/深入理解Java虚拟机第3版).pdf);longmillisecondInstant.now().toEpochMilli();try(FileInputStreamfileInputStreamnewFileInputStream(file)){while(true){intreadfileInputStream.read();if(read-1){break;}}}System.out.println(耗时: (Instant.now().toEpochMilli()-millisecond)ms);}}/* 耗时: 62638ms */可以看的出来耗时很久基于此我们利用装饰器模式自己改造一下FileInputStream。缓冲区的核心在于我们需要读取的时候保证效率高但是又不需要一口气读完所以我们需要创建一个缓冲区读取文件了保存下缓存内容需要的时候在内存中直接拿取。-BufferedFileInputStream.javapackageinsight.input;importjava.io.IOException;importjava.io.InputStream;/** * author: wangcai * date: 2025/12/16 */publicclassBufferedFileInputStreamextendsInputStream{privatefinalInputStreamin;// 缓冲区 默认8kbbyte[]buffernewbyte[8192];// 标志位 为-1时代表不可读 其余为读取的开始位置privateintbufferPos-1;// 用来避免超出的读取文件privateintcapacity-1;publicBufferedFileInputStream(InputStreaminputStream){this.ininputStream;}Overridepublicintread()throwsIOException{if(buffCanRead()){returnreadFromBuffer();}refreshBuffer();if(!buffCanRead()){return-1;}returnreadFromBuffer();}privateintreadFromBuffer(){returnbuffer[bufferPos]0xff;}privatevoidrefreshBuffer()throwsIOException{capacitythis.in.read(buffer);bufferPos0;}privatebooleanbuffCanRead(){if(capacity-1){returnfalse;}returnbufferPos!capacity;}Overridepublicvoidclose()throwsIOException{super.close();}}packageinsight.input;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;importjava.time.Instant;/** * author: wangcai * date: 2025/12/16 */publicclassUsage{publicstaticvoidmain(String[]args)throwsException{FilefilenewFile(src/main/resources/深入理解Java虚拟机第3版).pdf);longmillisecondInstant.now().toEpochMilli();try(InputStreamfileInputStreamnewBufferedFileInputStream(newFileInputStream(file))){while(true){intreadfileInputStream.read();if(read-1){break;}}}System.out.println(耗时: (Instant.now().toEpochMilli()-millisecond)ms);}}/* 耗时: 49ms */效率大大提升这也是官方源码中类似的用法的实践。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

icp备案网站建设方案书做外贸产品上什么网站

Elasticsearch 面试题深度图解:从原理到实战(附高频答案)当你的服务日志突然查不到了,Elasticsearch 背后发生了什么?这不只是运维的噩梦,更是面试官最爱问的问题之一。在现代技术体系中,Elasti…

张小明 2025/12/30 10:42:38 网站建设

网站建设移动网络c2c电子商务网站建设栏目结构图

第一章:Open-AutoGLM模型移动端部署概述将大型语言模型高效部署至移动设备是实现边缘智能的关键一步。Open-AutoGLM 作为一款开源的轻量化生成语言模型,具备较强的语义理解与文本生成能力,其设计初衷即包含对资源受限环境的支持。在移动端部署…

张小明 2025/12/30 12:03:27 网站建设

怎么查看竞争网站怎么做的seo网站宣传推广文案

REAL-Video-Enhancer是一款功能强大的开源视频增强工具,专为Linux、macOS和Windows用户设计,提供高质量的帧插值和超分辨率处理能力。这个免费的视频增强工具能够显著提升视频流畅度和清晰度,让老旧视频焕发新生。无论您是视频创作者、动漫爱…

张小明 2025/12/30 11:41:28 网站建设

网站的优化与推广购物网站排名 2019

还在为云端蛋白质结构预测的排队等待和隐私担忧而烦恼吗?🤔 LocalColabFold正是你需要的解决方案!这个强大的工具让你在本地就能运行ColabFold功能,无需依赖云端资源,轻松完成单蛋白预测、批量处理和定制化分析。无论你…

张小明 2025/12/30 12:03:23 网站建设

如何做视频类网站厦门人才网招聘官网

Klocwork 2025.3 新特性 在Klocwork 2025.3中,桌面工具和Validate门户网站的安装程序和用户界面已更新为新徽标,以反映Perforce品牌的更新,并提供一致的体验。 该版本增强了对 QNX 编译器的支持,并在使用现代 C/C 时&#xff0c…

张小明 2025/12/30 12:03:20 网站建设

ICP备案网站服务内容单位的网站的建设

Korn Shell 编程:整数运算与变量使用 1. 整数运算与表达式 在 Korn Shell 中,整数运算有着独特的实现方式。表达式 $(($OPTIND - 1)) 揭示了 shell 进行整数运算的方法。shell 将被 $(( 和 )) 包围的内容解释为算术表达式,并且在算术表达式里,变量前的美元符号并非…

张小明 2025/12/30 12:03:16 网站建设