`
geshenyi
  • 浏览: 100931 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从优秀迈向卓越 -- 我的设计模式学习感悟

阅读更多
我们在发现问题到解决问题这个过程中,常会发现很多问题是重复出现的,或是某个问题的变体,外在不同,而本质相同,建筑学上如是,软件行业也是,这些问题的本质就是模式。有人说,设计模式并不是初学者能够理解的,当他们的编程经验到了一定程度,便迫切的需要设计模式来完善自己的代码、优雅自己的设计,以及减少重复编码,这句话也是蛮有道理的,以我的亲身经历来说,当刚开始编程时,拿起那本设计模式的书,郁郁寡欢,将该书搁于书架两年后再次捧起,如遇知音。本文以我在以往项目中遇到的三个编码问题来谈谈学习设计模式的必要性。

一、代码量激增、程序可维护性面临挑战

   让我们来看几段常见但又不够优雅的代码,这些代码 “你”、“我”、“他”或许都曾写过,但是终有一天你也会与我一样,看着有想撞墙的感觉(如果你写了N久这样的代码,还没有这种感觉,八成你是对编程不再感兴趣了,你对其已经麻木):

1. 过多的if…else判断if (type == 1) {
//调用获取信息方法1
} else if (type == 2) {
//调用获取信息方法2
   …….
} else {
    //调用获取信息方法7
}
这是我在做一个项目中看到的一段代码,那个条件判断非常之长,有7个条件分支,而且其他有些地方也有根据类型来做不同处理的情况。这些代码对于后阶段的维护简直是一场噩梦。

2.多次载入资源(例如配置文件的读取),引起资源损耗public static String getProperty(String propKey) throws Exception ...{
Properties prop = new Properties();
InputStream propConfFile = Util.class.getClassLoader()
.getResourceAsStream("configure.properties");
//载入propConfFile到prop中,从prop中获取propKey的值,并将其返回
}

  该段代码是我以前在一个项目中写的一段代码,该段代码用于读取工程配置文件的属性,但该段代码是存在一些问题的,因为在每次获取属性时,它都重新载入资源,造成了资源的过多损耗。

3.         过多依赖实现类

1)水果接口类—Fruit.java
public interface Fruit {
public void grow();
}


2)水果的实现类—Apple.java、Strawberry.java
//略
3)测试类—Test.java
public class Test {
public static void main(String[] args) {
Fruit apple = new Apple();     
Fruit strawberry = new Strawberry();
}
}
在我们的项目中尚未采用Spring时,类似这样的程序很多,与实现类的过度耦合是这段代码存在的一个主要问题。

在我编码的过程中,遇到的问题还有很多。不够优雅的代码、过于僵硬的设计,等等,下面我将通过如上三个例子讨论一下学习设计模式的必要性和我学习设计模式的经历,以及通过改进如上编码来认识学习设计模式给我们的编码带来的好处。

二、借“设计模式”之力冲出代码包围圈

如上的三段代码,都是存在不少问题的,让我们一一讨论,通过在其中应用设计模式,来优化我们的这三段代码,提高其扩展性和易维护性。

1.       解决过多的if…else判断问题
   如果在一段代码中,不少地方需根据某类型或状态等做出不同的处理,那当类型或状态增加时,这些代码将会过于僵硬,扩展性差,只有在各个分布了if…else的再增加一个else if,可维护性可想而知。设计模式中有一种模式可以解决该问题,即状态模式。状态模式给我们带来的好处如下:
   1) 状态模式需要对每一个对每一个系统可能取得的状态创立一个状态类(State)的子类,当系统的状态变化时,系统改变所选的子类。与一个特定的状态有关的行为都被包装在一个特定的对象里,而且当需要增加新的状态时,可以以子类的方式将它加到系统里,从而提高了易维护性和可扩展性;
2)由于每一个状态都被包装到了类里面,避免了使用过多的条件转移语句。
下面我们对该例进行演示性的改进。我们可以定义一个类型接口,该类相当于状态模式中的状态类。
public interface Type {
    /**
     * 获取信息
     */
    public Object getInfo();

    /**
     * 获取结果
     */
    public Object getResult();
}
类型1、类型2等可以实现该接口,代码略:  

2. 解决过度资源损耗问题
   在该例中,每次通过getProperty(…)方法获取某属性时,都会重新载入文件中的所有内容,造成资源的不必要损耗。该设计模式中,对于此种情况,可以通过单例(Singleton)模式来优化处理。
import //略
public class PropertiesUtil ...{
    private static Map propertiesMap = null;
    public static String getProperty(String propKey) throws Exception ...{
       if (propertiesMap == null) ...{
        //当propertiesMap为空时,载入文件,将其键值对放入propertiesMap中(略)
       }
       //在propertiesMap中获得propKey属性,并将值返回(略)
    }
}
可以考虑实现单例模式的地方还有很多,例如:
1)          对于计算机的外部资源打印机的情况,因只有一个Printer Spooler,为避免两个打印作业同时输出到打印机中,可考虑用单例模式实现。
2)          Window的回收站在整个系统中只有唯一的一个实例,而且回收站自行提供自己的实例,回收站也是单例模式的应用

在该例的测试类Test.java中,通过Fruit apple = new Apple();来获得对象,造成了程序过多的依赖实现类,与实现类过度耦合,学习设计模式后,我们可以考虑采用工厂模式来实现,可对代码进行如下改进:增加工厂类FruitGardener.java,该类的工厂方法如下:
public static Fruit factory(String fruitType) ...{
if (fruitType.equalsIgnoreCase("apple")) ...{
        return new Apple();
    } else if (fruitType.equalsIgnoreCase("strawberry")) ...{
        return new Strawberry();
    } else ...{
        return null;
    }
}


增加了水果工厂类后,测试类也要做对应修改,修改后的Test.java的main方法如下:
Fruit apple = FruitGardener.factory("apple");
Fruit strawberry = FruitGardener.factory("strawberry");

在进行了对应修改后,测试类大大减少了对水果实现类的依赖,由直接new实现类变成了通过传入字符串来获得需要的实例,工厂模式应用很广泛,例如在现在红得似火的spring也在不少地方用了工厂模式,它本身就是一个很大的bean工厂,不过它在代码上进行了更大的改进,各实现类可以通过配置文件设置。

三、设计模式 –––– 由优秀迈向卓越的阶梯
   从以上三个例子中我们可以看出,通过使用设计模式,优化了我们的代码。这样的例子在我们日常的编码过程中有很多,在我们刚开始学习编码时,写这样的代码还说得过去,但随着经验的增长,我们需要更进一步,现有的设计模式给我们提供了解决大多数问题的好方案,当然,在实践的过程中,我们甚至可以探索出新的设计模式,来解决遇到的某类问题。
   学习设计模式不是一蹴而就的,很多人叹息设计模式似乎很不错,然而在自己的编码设计生涯中用得极少,我想主要原因是因为对设计模式的学习还不够,还没将其变成属于自己脑袋里的东西,所以当问题变着面孔出现时,认识不到问题的存在,因为不能正确的分析问题、认识问题,当然也不可能很好的解决问题。
   还未学习过设计模式或对其知之甚少的程序员们,努力学习设计模式吧,那将使你由一个优秀的程序员(Coder)成为一个卓越的软件设计师(Developer)。
分享到:
评论
1 楼 xyheritrix 2012-04-01  
看了后我没一点点刺激,你的3个例子对我根本说明不了问题,在我看来几乎是小菜一碟,根本扯不上模式的问题,太牵强。

相关推荐

    从优秀到卓越

    《从优秀到卓越》是吉姆·柯林斯的一部...总结来说,这本书强调了领导力、人员选择、核心理念、文化建设和策略执行在企业从优秀迈向卓越过程中的重要性,为管理者提供了实践指南,鼓励他们超越优秀,追求真正的卓越。

    卓越的秘密——如何从优秀经理人迈向卓越领导者.docx

    《卓越的秘密——如何从优秀经理人迈向卓越领导者》一书,深入探讨了领导力的本质和进化路径,特别是如何从优秀的管理者成长为卓越的领导者。作者赵实引用了Zenger Folkman创始人曾格(Jack Zenger)和尤里奇(Dave ...

    《迈向5G-C-RAN:需求、架构与挑战》白皮书

    《迈向5G-C-RAN:需求、架构与挑战》白皮书 自从2009年,中国移动首次提出C-RAN概念,已有7年。期间中国移动一直保持着每隔几年发布一个版本的C-RAN白皮书,向业界通报C-RAN进展并呼吁业界共同参与C-RAN的研发。这...

    中国联通构建高阶自智网络,加速迈向智能时代-自智网络白皮书(2024).pdf

    【中国联通】构建高阶自智网络,加速迈向智能时代-自智网络白皮书(2024).pdf【中国联通】构建高阶自智网络,加速迈向智能时代-自智网络白皮书(2024).pdf【中国联通】构建高阶自智网络,加速迈向智能时代-自智...

    从优秀到卓越学习总结.doc

    【从优秀到卓越学习总结】 本总结源自《从优秀到卓越》一书,该书深入探讨了企业如何从优秀迈向卓越的关键因素。作者通过长期的研究和严谨的数据分析,揭示了一系列核心理念,旨在帮助企业打破现状,实现质的飞跃。...

    碳中和报告:迈向零碳-基于科技创新的绿色变革.pdf

    碳中和报告:迈向零碳-基于科技创新的绿色变革.pdf

    李开复给中国学生的第二封信——从优秀到卓越

    此次,《给中国学生的一封信——从优秀到卓越》是基于过去几年里收到的学生们的反馈和提问而撰写,旨在进一步指导学生们如何从优秀迈向卓越。 #### 二、卓越领导力 ##### 1. 领导力的重要性 在当今社会,无论是在...

    Java和Android源码设计模式

    ### Java和Android源码设计模式 #### 前言:迈向精通之路——设计模式的重要性 在软件开发领域,设计模式被视为提升代码质量和可维护性的...对于想要从3K迈向1W月薪的程序员来说,掌握这些设计模式是至关重要的一步。

    企业从优秀到卓越的奥秘.zip

    《企业从优秀到卓越的奥秘》是一份深入探讨企业成长与转型的资料,通过这份压缩包中的PPTX文件,我们可以挖掘出一系列关于企业管理、战略规划和组织文化的宝贵知识点。 1. **卓越企业的特质** - 领导力:卓越的...

    碳中和报告:迈向零碳-基于科技创新的绿色变革.docx

    碳中和报告:迈向零碳-基于科技创新的绿色变革.docx

    保险行业2020Q1综述及Q2展望:权益市场波动险企盈利分化,Q2有望迈向常态-20200507-长城证券-14页.pdf

    保险行业2020Q1综述及Q2展望:权益市场波动险企盈利分化,Q2有望迈向常态-20200507-长城证券-14页.pdf

    从优秀到卓越心得.doc

    书中强调的核心观点是第五级管理人的概念,他们是推动企业从优秀迈向卓越的关键人物。第五级经理人具备独特的品质,他们既谦虚又坚定,不以个人名利为目标,而是将个人价值与公司愿景紧密结合,为实现公司卓越贡献...

    设计模式可复用面向对象软件的基础(c++).pdf

    总之,《设计模式可复用面向对象软件的基础》一书为C++开发者提供了一个全面而深入的面向对象设计指南,无论你是初学者还是有经验的软件工程师,都能从中获得宝贵的知识和灵感,推动自己的职业生涯迈向更高的台阶。

    安图生物-603658-国产化学发光龙头,多元布局迈向卓越.zip

    从压缩包内的文件名来看,“安图生物-603658-国产化学发光龙头,多元布局迈向卓越.rar”可能包含的是关于安图生物的详细报告或者分析资料,包括公司的财务数据、产品研发、市场表现、战略规划等内容。这类资料对于...

    城市更新4.0迈向卓越的全球城市研发.pdf

    城市更新4.0是当前全球城市发展的新阶段,它标志着城市的转型从传统的物质改造扩展到智慧、可持续和社会包容性的发展。这一概念强调了利用科技、数据和创新来提升城市的宜居性、经济活力和环境质量。 在城市更新4.0...

    从A到A+企业从优秀到卓越的奥秘.ppt

    这本书深入探讨了企业如何从优秀迈向卓越的过程,以及如何使表现优异的企业持续展现出杰出的业绩。书中提到的研究小组以实事求是的精神和严谨的态度,花费五年时间对多个阶段的企业进行了分析。 在筛选“从优秀到...

    行业2020Q1综述及Q2展望:权益市场波动险企盈利分化,Q2有望迈向常态-20200507-长城-14页.rar

    这份名为“行业2020Q1综述及Q2展望:权益市场波动险企盈利分化,Q2有望迈向常态-20200507-长城-14页.rar”的压缩包文件,内含一份14页的长城证券行业报告,主要探讨了2020年第一季度保险行业的整体表现以及对第二...

    设计模式解析-英文

    设计模式解析(第2版)》以作者自身学习、使用模式和多年来为软件开发人员(包括面向对象技术老兵和新手)讲授模式的经验为基础撰写而成。首先概述了模式的基础知识,以及面向对象分析和设计在当代软件开发中的重要性,...

Global site tag (gtag.js) - Google Analytics