温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
2023
学习
设计
模式
一些
感想
学习设计模式的一些感想
设计模式在编程中的应用
我们在发现问题到解决问题这个过程中,常会发现很多问题是重复出现的,或是某个问题的变体,外在不同,而本质相同,建筑学上如是,软件行业也是,这些问题的本质就是模式。有人说,设计模式并不是一日两日能够理解的,当编程经验到了一定程度,便迫切的需要设计模式来完善自己的代码、优雅自己的设计,以及减少重复编码,这句话也是蛮有道理的,以自己的亲身经历来说,当刚开始编程时,没有一点设计理念,等到开设这门课以后再细读理解,把里面的思想带到自己的工程中,就会觉得有很多值得深思的地方。本文以我在以往工程中遇到的三个编码问题来谈谈学习设计模式的必要性。
一、代码量激增、程序可维护性面临挑战
我想这样的代码我们从学习c语言就开始接触,现在很多地方还在用,以后工作可能用的更多但是,大家都写的东西,我们自己的优势在哪里呢。
1.过多的if"else判断if(type==1){//调用获取信息方法1}elseif(type==2){//调用获取信息方法2"".}else{//调用获取信息方法7}这是我在做一个工程中看到的一段代码,那个条件判断非常之长,有7个条件分支,而且其他有些地方也有根据类型来做不同处理的情况。
2.屡次载入资源(例如配置文件的读取),引起资源损耗
publicstaticstringgetproperty(stringpropkey)throwsexception...{propertiesprop=newproperties;inputstreampropconffile=util.class.getclassloader.getresourceasstream("configure.properties");//载入propconffile到prop中,从prop中获取propkey的值,并将其返回}
该段代码是我以前在一个工程中写的一段代码,该段代码用于读取配置文件的属性,但该段代码是存在一些问题的,因为在每次获取属性时,它都重新载入资源,造成了资源的过多损耗。
3.过多依赖实现类
1)水果接口类—fruit.javapublicinterfacefruit{publicvoidgrow;}
2)水果的实现类—apple.java、strawberry.java//略
3)测试类—test.javapublicclasstest{publicstaticvoidmain(stringargs){fruitapple=newapple;fruitstrawberry=newstrawberry;}}在我们的工程中尚未采用spring时,类似这样的程序很多,与实现类的过度耦合是这段代码存在的一个主要问题。
在我编码的过程中,遇到的问题还有很多。不够优雅的代码、过于僵硬的设计,等等,通过改进如上编码来认识学习设计模式给我们的编码带来的好处。
二、借“设计模式〞之力冲出代码包围圈
如上的三段代码,都是存在不少问题的,让我们一一讨论,通过在其中应用设计模式,来优化我们的这三段代码,提高其扩展性和易维护性。
1.解决过多的if"else判断问题
如果在一段代码中,不少地方需根据某类型或状态等做出不同的处理,那当类型或状态增加时,这些代码将会过于僵硬,扩展性差,只有在各个分布了if"else的再增加一个elseif,可维护性可想而知。设计模式中有一种模式可以解决该问题,即状态模式。状态模式给我们带来的好处如下:
1)状态模式需要对每一个对每一个系统可能取得的状态创立一个状态类(state)的子类,当系统的状态变化时,系统改变所选的子类。与一个特定的状态有关的行为都被包装在一个特定的对象里,而且当需要增加新的状态时,可以以子类的方式将它加到系统里,从而提高了易维护性和可扩展性;
2)由于每一个状态都被包装到了类里面,防止了使用过多的条件转移语句。
下面我们对该例进行演示性的改进。我们可以定义一个类型接口,该类相当于状态模式中的状态类。
publicinterfacetype{/xxx获取信息x/publicobjectgetinfo;/xxx获取结果x/publicobjectgetresult;}类型
1、类型2等可以实现该接口,代码略:
2.解决过度资源损耗问题
在该例中,每次通过getproperty(")方法获取某属性时,都会重新载入文件中的所有内容,造成资源的不必要损耗。该设计模式中,对于此种情况,可以通过单例(singleton)模式来优化处理。import//略
publicclasspropertiesutil...{privatestaticmappropertiesmap=null;publicstaticstringgetproperty(stringpropkey)throwsexception...{if(propertiesmap==null)...{//当propertiesmap为空时,载入文件,将其键值对放入propertiesmap中(略)}//在propertiesmap中获得propkey属性,并将值返回(略)}}
可以考虑实现单例模式的地方还有很多,例如:
1)对于计算机的外部资源打印机的情况,因只有一个printerspooler,为防止两个打印作业同时输出到打印机中,可考虑用单例模式实现。
2)window的回收站在整个系统中只有唯一的一个实例,而且回收站自行提供自己的实例,回收站也是单例模式的应用
3、解决过多依赖实现类问题
在该例的测试类test.java中,通过fruitapple=newapple;来获得对象,造成了程序过多的依赖实现类,与实现类过度耦合,学习设计模式后,我们可以考虑采用工厂模式来实现,可对代码进行如下改进:增加工厂类fruitgardener.java,该类的工厂方法如下:publicstaticfruitfactory(stringfruittype)...{if(fruittype.equalsignorecase("apple"))...{returnnewapple;}elseif(fruittype.equalsignorecase("strawberry"))...{returnnewstrawberry;}else...{returnnull;}}
增加了水果工厂类后,测试类也要做对应修改,修改后的test.java的main方法如下:fruitapple=fruitgardener.factory("apple");fruitstrawberry=fruitgardener.factory("strawberry");
在进行了对应修改后,测试类大大减少了对水果实现类的依赖,由直接new实现类变成了通过传入字符串来获得需要的实例,工厂模式应用很广泛,例如在现在红得似火的spring也在不少地方用了工厂模式,它本身就是一个很大的bean工厂,不过它在代码上进行了更大的改进,各实现类可以通过配置文件设置。
三、设计模式––––由优秀迈向卓越的阶梯
从以上三个例子中我们可以看出,通过使用设计模式,优化了我们的代码。这样的例子在我们日常的编码过程中有很多,在我们刚开始学习编码时,写这样的代码还说得过去,但随着经验的增长,我们需要更进一步,现有的设计模式给我们提供了解决大多数问题的好方案,当然,在实践的过程中,我们甚至可以探索出新的设计模式,来解决遇到的某类问题。
学习设计模式不是一蹴而就的,很多人叹息设计模式似乎很不错,然而在自己的编码设计生涯中用得极少,我想主要原因是因为对设计模式的学习还不够,还没将其变成属于自己脑袋里的东西,所以当问题变着面孔出现时,认识不到问题的存在,因为不能正确的分析问题、认识问题,当然也不可能很好的解决问题。
还未学习过设计模式或对其知之甚少的程序员们,努力学习设计模式吧,那将使你由一个优秀的程序员(coder)成为一个卓越的软件设计师(developer)。
第6页 共6页