首页 文章 精选 留言 我的

精选列表

搜索[SpringBoot4],共10000篇文章
优秀的个人博客,低调大师

给女友讲讲设计模式——原型模式(JAVA实例)4

前言 上高中那阵子,特别迷恋火影,所以每周都会等着更新。最让我难忘的是里面的主人公鸣人,和他的各种各样炫酷的技能。他的影分身,一下子可以分离出来多个自己,并且这些自己的副本使用的技能都是相同的。如果他的副本想要使用其他的技能,除非分身再克隆出来一个技能的副本,然后去进行学习。 正文 刚刚说的那个例子,大家先记着,接下来我慢慢揭开圆形模式的面纱。原型模式,简单来说就像是我们操纵电脑使的复制粘贴,只不过我们是要去操纵对象。在java中使用原型模式特别的简单,只需要重写clone()方法,然后实现Cloneable接口(其实这个接口是一个空接口,只是为了告诉jvm,这个类是可以克隆的); 原型模式一共分为两种: 1.浅克隆 2.深克隆 下面看看浅克隆的代码 这是一个忍者的实体类,代表鸣人的。 package prototype; public class Nanjia implements Cloneable{ private String name; private Integer age; private Skill skill; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Skill getSkill() { return skill; } public void setSkill(Skill skill) { this.skill = skill; } @Override public Nanjia clone() { try { Nanjia nanjia=(Nanjia)super.clone(); return nanjia; } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public String toString() { return "Nanjia [name=" + name + ", age=" + age + ", skill=" + skill + "]"; } } 然后是一个skill的实体类,可以装者技能的种类和名称 package prototype; public class Skill{ private String name; private String type; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public String toString() { return "Skill [name=" + name + ", type=" + type + "]"; } } package prototype; public class MainTest { public static void main(String[] args) { Nanjia nanjia=new Nanjia(); nanjia.setAge(16); nanjia.setName("漩涡鸣人"); Skill skill=new Skill(); skill.setName("仙人模式"); nanjia.setSkill(skill); System.out.println("这是需要被克隆的类"); System.out.println(nanjia); Nanjia nanjia2=nanjia.clone(); Skill skill2=nanjia2.getSkill(); skill2.setName("螺旋丸"); nanjia2.setSkill(skill2); System.out.println("这是克隆出来的类"); System.out.println(nanjia2); System.out.println("这是原来的类"); System.out.println(nanjia); } } 在测试类中我们做了这样的操作,将一些属性赋予nanji的实体类中,然后我们通过克隆复制出了一个副本,可以看作类似于影分身一样,然后拿出副本中的技能将它转换为别的技能,最后我们会发现原来本身的技能也发生了变化,这是怎么一回事呢? 这是因为浅克隆,在克隆的过程中,对象中的实体引用,只是复制了这个引用的地址,所以在修改的时候就相当于把原来本体的技能同样进行修改。 那我们要是想不影响之前的本体该怎么办呢,接下来隆重介绍深克隆。 深克隆是把忍者类中的技能类也重写了克隆方法,这样在影分身的副本中我们就可以自由转换,而不影响忍者这个本体了。 然后是深克隆的代码: package prototype; public class Nanjia implements Cloneable{ private String name; private Integer age; private Skill skill; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Skill getSkill() { return skill; } public void setSkill(Skill skill) { this.skill = skill; } @Override public Nanjia clone() { try { Nanjia nanjia=(Nanjia)super.clone(); //关键的地方在这里,我们像克隆忍者一样,把技能这个类也进行了克隆 nanjia.setSkill((Skill)nanjia.getSkill().clone()); return nanjia; } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public String toString() { return "Nanjia [name=" + name + ", age=" + age + ", skill=" + skill + "]"; } } 我们继承了Cloneable接口,重写了Clone这个方法。 package prototype; public class Skill implements Cloneable{ private String name; private String type; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public String toString() { return "Skill [name=" + name + ", type=" + type + "]"; } @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } } package prototype; public class MainTest { public static void main(String[] args) { Nanjia nanjia=new Nanjia(); nanjia.setAge(16); nanjia.setName("漩涡鸣人"); Skill skill=new Skill(); skill.setName("仙人模式"); nanjia.setSkill(skill); System.out.println("这是需要被克隆的类"); System.out.println(nanjia); Nanjia nanjia2=nanjia.clone(); Skill skill2=nanjia2.getSkill(); skill2.setName("螺旋丸"); nanjia2.setSkill(skill2); System.out.println("这是克隆出来的类"); System.out.println(nanjia2); System.out.println("这是原来的类"); System.out.println(nanjia); } } 后记 克隆模式却是在制作副本,并且副本极其相似的情况下,给我们带来了很多便利性,但是如果类结构相对复杂,我们不但得在每一个实体中加入克隆方法,并且这样做还不符合开闭原则。所以在使用之前,应该根据需求,看看需不需要用到原型模式

优秀的个人博客,低调大师

4个Python实战项目,让你瞬间读懂Python!

前言 Python当下真的很火。Python实战项目,也一直尤为关注,接下来,和大家介绍下十个Python练手的实战项目 python项目练习一:即时标记 这是《python基础教程》后面的实践,照着写写,一方面是来熟悉python的代码方式,另一方面是练习使用python中的基本的以及非基本的语法,做到熟能生巧。 这个项目一开始比较简单,不过重构之后就有些复杂了,但是更灵活了。 按照书上所说,重构之后的程序,分为四个模块:处理程序模块,过滤器模块,规则(其实应该是处理规则),语法分析器。 先来说处理程序模块,这个模块的作用有两个,一个是提供那些固定的html标记的输出(每一个标记都有start和end),另一个是对这个标记输出的开始和结束提供了一个友好的访问接口。来看下程序handlers.py: 这个程序堪称是整个“项目”的基石所在:提供了标签的输出,以及字符串的替换。理解起来也比较简单。 再来看第二个模块“过滤器”,这个模块更为简单,其实就是一个正则表达式的字符串。相关代码如下: 这就是三个过滤器了,分别是:强调牌过滤器(用×号标出的),url牌过滤器,email牌过滤器。熟悉正则表达式的同学理解起来是没有压力的。 再来看第三个模块“规则”,这个模块,抛开那祖父类不说,其他类应该有的两个方法是condition和action,前者是用来判断读进来的字符串是不是符合自家规则,后者是用来执行操作的,所谓的执行操作就是指调用“处理程序模块”,输出前标签、内容、后标签。 来看下这个模块的代码,其实这个里面几个类的关系,画到类图里面看会比较清晰。 rules.py: 补充utils.py: 如果你在学习Python的过程中遇见了很多疑问和难题,可以加-q-u-n227 -435-450里面有软件视频资料免费 总结一下: 最后隆重的来看下“语法分析器模块”,这个模块的作用其实就是协调读入的文本和其他模块的关系。在往重点说就是,提供了两个存放“规则”和“过滤器”的列表,这么做的好处就是使得整个程序的灵活性得到了极大的提高,使得规则和过滤器变成的热插拔的方式,当然这个也归功于前面在写规则和过滤器时每一种类型的规则(过滤器)都单独的写成了一个类,而不是用if..else来区分。 看代码: 这个模块里面的处理思路是,遍历客户端(也就是程序执行的入口)给插进去的所有的规则和过滤器,来处理读进来的文本。 有一个细节的地方也要说一下,其实是和前面写的呼应一下,就是在遍历规则的时候通过调用condition这个东西来判断是否符合当前规则。 我觉得这个程序很像是命令行模式,有空可以复习一下该模式,以保持记忆网节点的牢固性。 最后说一下我以为的这个程序的用途: 1、用来做代码高亮分析,如果改写成js版的话,可以做一个在线代码编辑器。 2、可以用来学习,供我写博文用。 还有其他的思路,可以留下您的真知灼见。 补充一个类图,很简陋,但是应该能说明之间的关系。另外我还是建议如果看代码捋不清关系最好自己画图,自己画图才能熟悉整个结构。 python项目练习二:画幅好画 这是《python基础教程》中的第二个项目,关于python操作PDF 涉及到的知识点 1、urllib的使用 2、reportlab库的使用 这个例子着实很简单,不过我发现在python里面可以直接在数组[]里面写for循环,真是越用越方便。 下面是代码: python项目练习三:万能的XML 这个项目的名称与其叫做万能的XML不如叫做自动构建网站,根据一份XML文件,生成对应目录结构的网站,不过只有html还是太过于简单了,如果要是可以连带生成css那就比较强大了。这个有待后续研发,先来研究下怎么html网站结构。 既然是通过XML结构生成网站,那所有的事情都应该由这个XML文件来。先来看下这个XML文件,website.xml: 有了这个文件,下面应该来看怎么通过这个文件生成网站。 首先我们要解析这个xml文件,python解析xml和在java中一样,有两种方式,SAX和DOM,两种处理方式不同点在于速度和范围,前者讲究的是效率,每次只处理文档的一小部分,快速而能有效的利用内存,后者是相反的处理方式,先把所有的文档载入到内存,然后再进行处理,速度比较慢,也比较消耗内存,唯一的好处就是可以操作整个文档。 在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler,后面的这个类是要和parse函数来配合使用的。使用方式如下: parse('xxx.xml',xxxHandler),这里面的xxxHandler要继承上面的ContentHandler,不过只要继承就行,不需要有所作为。 然后这个parse函数在处理xml文件的时候,会调用xxxHandler中的startElement函数和endElement函数来一个xml中的标签的开始和结束,中间的过程使用一个名为characters的函数来处理标签内部的所有字符串。 有了上面的这些认识,我们已经知道如何处理xml文件了,然后再来看那个罪恶的源头website.xml文件,分析其结构,只有两个节点:page和directory,很明显page表示一个页面,directory表示一个目录。 所以处理这个xml文件的思路就变的清晰了。读取xml文件的每一个节点,然后判断是page还是directory如果是page则创建html页面,然后把节点中的内容写到文件里。如果遇到directory就创建一个文件夹,然后再处理其内部的page节点(如果存在的话)。 下面来看这部分代码,书中的实现比较复杂,比较灵活。先来看,然后在分析。 看起来这个程序上面分析的复杂了一些,不过伟人毛毛说过,任何复杂的程序都是纸老虎。那我们再来分析一下这个程序。 首先看到这个程序是有两个类,其实完全可以当作一个类,因为有了继承。 然后再来看它多了些什么,除了我们分析出来的startElement和endElement以及characters,多出来了startPage,endPage;startDirectory,endDirectory;defaultStart,defaultEnd;ensureDirectory;writeHeader,writeFooter;和dispatch,这些个函数。除了dispatch,前面的函数都很好理解,每一对函数都是单纯的处理对应的html标签以及xml节点。而dispatch比较复杂,复杂之处在于他是用来动态拼合函数并且进行执行的。 dispatch的处理思路是,首先根据传递的参数(就是操作名称以及节点名称)判断是否存在对应的函数如startPage,如果不存在则执行default+操作名称:如defaultStart。 一个函数一个函数搞清楚之后,就知道整个处理流程是什么样了。首先创建一个public_html的文件,存放整个网站,然后读xml的节点,通过startElement和endElement调用dispatch进行处理。然后就是dispatch怎么调用具体的处理函数了。 到此为止,这个项目算是分析完了。 主要掌握的内容一个是python中使用SAX处理XML,另一个就是python中的函数的使用,比如getattr,传参数时的星号…… python项目练习四:新闻聚合 书中的第四个练习,新闻聚合。现在很少见的一类应用,至少我从来没有用过,又叫做Usenet。这个程序的主要功能是用来从指定的来源(这里是Usenet新闻组)收集信息,然后讲这些信息保存到指定的目的文件中(这里使用了两种形式:纯文本和html文件)。这个程序的用处有些类似于现在的博客订阅工具或者叫RSS订阅器。 先上代码,然后再来逐一分析: 这个程序,首先从整体上进行分析,重点部分在于NewsAgent,它的作用是存储新闻来源,存储目标地址,然后在分别调用来源服务器(NNTPSource以及SimpleWebSource)以及写新闻的类(PlainDestination和HTMLDestination)。所以从这里也看的出,NNTPSource是专门用来获取新闻服务器上的信息的,SimpleWebSource是获取一个url上的数据的。而PlainDestination和HTMLDestination的作用很明显,前者是用来输出获取到的内容到终端的,后者是写数据到html文件中的。 有了这些分析,然后在来看主程序中的内容,主程序就是来给NewsAgent添加信息源和输出目的地址的。 这确实是个简单的程序,不过这个程序可是用到了分层了

优秀的个人博客,低调大师

程序员的4条忠告,你做到了几条

入互联网这个行业,并学习编程语言的看过来,我自己是学 Java 的,总结了一下初学者的问题,还有即将毕业找不到很好工作,想自学一下或者是找个培训班集训下的思考,最后给出了几点建议,希望能够帮助到初学者。 热爱学习技术,一头埋进互联网这个行业,并且选择了 Java 这一条道路,很多人或多或少都会有两个主要的原因。 其一,自己喜欢做 web 这块。 其二,Java 语言比较流行,很好找工作。 目前,根据互联网的统计,Java 确实已经成为了世界语言的领头羊,它的应用领域广泛,具有很不错的前景。 下图是根据 Tiobe 官网发布的 2018 年编程语言排行榜,我们可以看到 Java 依然排在第一位。相信每个选择 Java 的都会感到高兴,我们走在大多数人的前面。但是高兴归高兴,以后的道路还需要我们每个人的努力,打造更好的未来。 虽然前景无限好,但是回想起来自己走过的道路,说不上是顺利,但经历的困难确实不少,接下来我会分享一些学习心得,以及在选择学习 Java 的时候,到底应不应该去报个班,怎么样去选择适合自己的方式。 先说下报不报班的问题,对于这个问题每个人都会有不同的回答,这也是因人而异的。 上培训班的好处是可以少走一些不必要的弯路,因为已经有人替你走过了,他们告诉你,从而避免了这些坑,同时也节省了不少时间。其次是可以跟着班走,有一定的学习环境和氛围,有同学可以进行交流和老师指导,这些对于那些一个人无法学习和不能控制自己的是一个非常不错的学习方式,而且可以通过学习一段时间就可以出去进行就业。 但是培训班也有一定的不好之处。第一就是价格问题,一般都是上万的,对于很多刚刚要毕业的同学,这个报名价格对于他们自己来说可以说是天文数字(排除那些家里舍得为孩子花钱的人,有钱人)。 然而培训机构还会有一些诱惑人的方法,比如说先就业在付款,这种是可能有人去选择的,不能说这种方法不好,但是当你选择这种方法的时候,你就让自己背负了一些债。 我们还没挣钱就先学会了负债,这对我们来说是一个非常糟糕的消息,然而这种负债的习惯可能影响你很长时间,比如花呗、信用卡等,这些都是让你在负债,请你学会阻止自己负债,那就是停掉自己的花呗、信用卡等,让自己终止这个坏习惯(先消费在存储)。 第二就是培训班基本上是课程制的,也就是有周期,课比较固定,这也就不可能满足每一个人。对于学习效率比较高的人来说,这些进度会慢,对于学习比较慢的同学又会觉得快。 那么我们可不可以通过其它方式来学习呢,答案是有的,我想有一部分人已经干过这样的事情了。那就是通过视频自学学习的方式。 通过视频自学的好处是我们可以多次观看学习,减少自己的记忆压力,而且可以培养自己的独立思考能力,因为我们有时间去想,同时可以对特定的知识点反复看,反复思考,这样我们学习的过程就像在跟技术沟通一样,可以学到不少东西。 但是视频学习的缺点在于没有人监督你,缺少老师的指点,对于不会的和重要的知识点,无法有更深的体会和把握。会有时感觉自我学习的不错,有时会感觉学习遇到瓶颈。遇到这样的情况时,我们可以找几个志趣相同的伙伴一起学习,遇到问题时可以相互交流,有一起学习的伙伴这样坚持学下去的机会,也会更大,不会学着学着就放弃了。 每个人都要根据自己的情况,选择适合自己的道路,所谓条条大路通罗马。这些选择没有对与错,只有是否适合自己,最终的目标是学到知识并且达到自己的目标。 下面的几点经验总结,希望能够帮助那些初学者。或许正在看文章的你,也会有一些中肯之言,那请您在留言区留下您宝贵的建议,让更多的人可以看到。 一. 脚踏实地,不可操之过急。 做任何事情,都要记住不能操之过急,一定要打好基础。一个刚刚迈入互联网的初学者或者是有一定的计算机基础的初学者,一定要打好基础,脚踏实地的学习,为后面学习框架或者更高深的知识做好铺垫。 要学会给自己制定学习计划,按照计划去学习,千万不要学猴子丢了芝麻去捡西瓜。不要学习了一半线程知识之后觉得没啥意思,又去学其它的知识,结果发现对学的其它知识又不感兴趣,又转去学习其它的,这样浮躁的性格将会导致你什么都只是学到了皮毛,最后得到的结果就是自己什么都会点,什么也都不会。 给大家的建议就是,入门知识一定要吃透,多看视频讲解,反复思考和体会,直到自己学会为止。 二. 多敲代码,适当看书。 当你脚踏实地的开始学习,并且养成了良好的学习习惯,而且取得了一个不错的开端的时候。这个时候不应该只是看看书本知识,而是在看书本的时候,遇到书上的代码示例的时候一定要自己亲手敲一遍,千万不要觉得省事,觉得自己看懂了无所谓,这是一个大忌(眼高手低)。 要照着例子复制、敲一遍,只有实践才知道自己是否是真的会写代码,实践是检验自己的唯一标准。虽然说理解编程语言很重要,但是多动手,多思考,对自己学习有很大的帮助,只有理论和实践结合起来,让自己融会贯通,这才能真正掌握这门技能。 三. 学会思考和复盘。 跟着我们制定的计划学习的过程中,我们多多少少都会有遇到一些难题,或者自己的瓶颈区。解决这些问题的关键在于我们要学会冷静下来去思考和定期复盘。 在计划的每一个阶段我们要学会反思和总结,把自己学过的东西先思考一遍,看看哪些知识点还没有吃透,哪些已经学会了,把那些没有弄懂的,去思考和找解决方案,最后将这些进行总结。 在学习的过程中可以把自己遇到的难题和困惑记录下来,可以用博客或者记事本,只要自己方便复盘就行。定时去温习和反思,同时也要记录自己解决这些问题的经验和技巧,通过这些方法,和保持良好的习惯去定期思考和复盘,过一段时间你会发现成长了不少。(检验方法:发现自己以前就是 sb)。 四. 更新自己的技能。 互联网是一个更新换代非常快的行业,有必要保证自己不被行业所淘汰,那么就要保持不断的学习和探索。俗话说,活到老,学到了。 可以选择出现的一些新技术,这些新技术要跟自己所学的相关,而且比自己目前的技术水平要高,不断的去学习、钻研、探索才能提升自己的个人能力。这一点一般人基本上是不会去主动学习新技术和挑战自己,因为大家活在舒适区正在享受,如果你可以主动学习,打破自己的舒适区,相信你的能力肯定比他人要强的多,最起码你已经把很多人甩在了身后。 总而言之,要不断的学习,脚踏实地的学好技术,只要坚持,那片广袤的天地已为你留出一片天地。 最后分享一下自己之前学习看过的视频,自己选择只看了感兴趣的部分,看过之后觉得还不错,分享给大家。 后面找工作的时候,由于觉得做过的项目有点少,又撸了几个项目,也从项目中学习到了很多知识,这给后来的我找实习或者工作都有帮助,如果这些项目你也感兴趣,欢迎学习,也希望能够帮到你。 想要视频的,可以在公众号【funnyZhang】后台回复【Java学习视频】。

优秀的个人博客,低调大师

快速上手物联网解决方案(4)—— 数据转储

『物联网平台』默认将设备上传的数据存放在公有云中,实际业务场景下,时常有数据转储到私有数据库的需求,这时我们就需要用到『数据转发』功能。 数据转发前,我们得先了解设备上传到云端的数据到底长什么样。具体来说就是设备数据上报的 Topic 是什么? 在『物联网平台』中打开 设备管理 —— 查看 —— Topic类列表,即可查看该设备数据上下行的默认 Topic: 有了 Topic,我们对数据如何提取就有了底,接着我们跳转到『规则引擎』部分,选择创建规则 —— JSON 格式 —— 处理数据 —— 编辑 —— 输入以下查询字段: items.Accelerometer.value.X, items.Accelerometer.value.Y, items.Accelerometer.value.Z, deviceName() as device

优秀的个人博客,低调大师

4. Python3源码—字符串(bytes)对象

4.1. 字符串对象 字符串对象是“变长对象”。 4.1.1. Python中的创建 Python中字符串(bytes)对象创建最重要的方法为PyBytes_FromStringAndSize,如下Python语句最终会调用到PyBytes_FromStringAndSize: a = b'hello' b = str(b'world') 4.1.2. PyBytes_FromStringAndSize的C调用栈 词法解析,最终调到PyBytes_FromStringAndSize,调用顺序如下: // ast.c ast_for_expr =>ast_for_power =>ast_for_atom_expr =>ast_for_atom (case STRING) =>parsestrplus =>parses

优秀的个人博客,低调大师

【OSS 排查方案-4】OSS + RTMP 推流的 JAVA 方法

背景:目前有很多直播爱好者使用的是 OSS + RTMP 做的推流直播,其中不乏一些企业级别应用,由于 OSS 作为推流的接收略微有一些复杂,故单独开篇讲一下。其实不建议使用 OSS+RTMP 做直播推流,因为功能性相比专业的阿里云直播几乎为 0 ,而且性能上并不好。建议大家使用单独的直播服务。 首先:看下官网对于 OSS 推流的过程定义 只能使用RTMP推流的方式,不支持拉流。 必须包含视频流,且视频流格式为H264。 音频流是可选的,并且只支持AAC格式,其他格式的音频流会被丢弃。 转储只支持HLS协议。 一个LiveChannel同时只能有一个客户端向其推流。 RTMP 的推流格式: rtmp://your-bucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel live 等同于 RTMP

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册