`
zengbo0710
  • 浏览: 417370 次
社区版块
存档分类
最新评论

《设计模式精解》读后感

阅读更多
模式一直是J2EE领域的热门话题。两年前,对刚开始自学java并且到处碰壁的我,一本在图书馆借的《java与模式》看的我云里雾里,尽管心里面觉的他讲的很有道理,可对于没有实际项目经验的我,真正的理解和应用还很远很远。转眼工作快一年多了了,也做了几个不大不小的项目,尽管还只是个代码工人水准的,但是对于模式的兴趣越发浓厚,于是从书堆里找出来买了好久的GOF《设计模式》。这本书是圣经级别了,可我对C++的了解有限(虽然在学校里还是狠狠啃过好几本大部头,现在忘光了),而且这本圣经对初学者似乎不太友好,对模式也以罗列各条目为主,例子失当。于是买了《设计模式精解》,看china-pub的书评都说对初学者很有用,而且翻译的人也是我很佩服的gigix。
    在春节期间读完了这本书,本书详细介绍了13种常见的设计模式,以一个实际问题引出了对面向对象新观点和设计模式的讨论,在介绍完所有的模式后,更难能可贵的是作者详细介绍了自己对模式的使用经验(使用共同点/变化点分析,使用分析矩阵等),整本书读下来令人心旷神怡。
    我们为什么要学习设计模式呢?总之是为了获得可以复用和容易扩展的解决方案,建立通用术语以方便团队内的沟通交流,另外,模式能让你以更高的层次或者说视角去观察问题,这样的视角将你从过早处理细节的泥潭中解放出来。模式本身就是对如何创建优良面向对象设计策略的实现:
    1.针对接口编程
    2.优先使用对象组合,而不是类继承
    3.发现并封装变化点
    你可以在每一个模式的背后或者每一个优秀设计的背后看到这些原则的影子。比如abstract factory、adapter、strategy体现了针对接口编程,composite、bridge体现了优先使用组合而不是继承等。
   
    作者解释了面向对象的新观点:
   
                原来的观点                新的观点

对象           伴随有方法的数据            拥有责任的实体,或者说拥有特定行为的实体  


封装          数据隐藏                    各种形式的封装,1.数据的封装,2.方法的封装
                                           3.父类对子类的隐藏   4.其他对象的封装

继承          特化和复用                   对象分类的一种方法

    这些观点其实并不新,Martin Fowler提出了软件开发过程中的三种视觉:概念、规格和实现,过去我们对面向对象的观点来自于实现的角度(代码的角度)去观察,而新的观点只是从概念的角度重新观察面向对象设计。
    深入到具体模式的讨论,记录一些需要注意的问题:
1.Adapter与Facade模式的区别
它们都是包装器,但是两者也有细微的区别:
.两个模式中,我们都有已经存在的类(或者说系统)
.Facade模式中,我们无需针对接口编程;而Adapter模式我们必须针对接口编程
.Adapter模式通常是为了保持多态,而Facade模式对此不感兴趣
.动机不同,Facade模式是为了简化接口,而Adapter模式是针对一个现存的接口编程
结论:Facade模式简化接口,而Adapter模式将接口转换成另一个现有的接口

2.Bridge模式的理解
Bridge模式的意图是将抽象部分与它的实现部分分离,使它们可以独立的变化。这里的关键点是需要理解“实现部分”,如果把“实现部分”看成“对象外部、被对象使用的某种东西”,此模式就很好理解了。我们将变化转移到一个使用或者拥有变化的对象(此对象是指抽象类的对象和用来实现抽象类的派生类的对象)。当出现继承的类爆炸情况时,也许你该考虑此模式的应用场景了。此模式的UML图
Bridge1.jpg


3.Observer模式,实现自己的观察者模式也是很简单,不过java已经内置了对此模式的支持。java.util.Observer和java.util.Observable是此模式的一个实现版本,实际应用中你所需要做的只是实现Observer接口,和继承Observable类

4.Decorator模式是为现有的功能动态添加附加功能的一种方法,UML图如下
ShowImg.jpg
java的IO库是典型的应用实现,java.io.InputStream和java.io.OutputStream就是图中的Component接口,FilterInputStream继承InputStream(也就是图中的Decorator,装饰器),其他的如ByteArrayInputStream、FileInputStream等直接继承自InputStream的类就是被装饰对象,而继承FilterInputStream的就是各式各样的装饰者。

5.Strategy模式是一种定义算法家族的方法,所有的算法都做相同的工作,它们只是拥有不同的实现。当你的代码中出现了很多switch或者if else的语句,你应该考虑此模式。Strategy模式带来的缺点是类的数量的增加,在java中可以通过将实现类作为嵌套类放在Strategy抽象类中来解决。

6.singleton模式的实现
单线程应用:
第一种:静态初始化
<!---->public class Singleton {
    
private Singleton() {
    }

    
private static Singleton instance = new Singleton();

    
public static Singleton getInstance() {
        
return instance;
    }
}

第二种:lazy loading
<!---->public   class   Singleton   {    
    
private   static   Singleton   instance   =   null;  
   
    
public   static   Singleton   getInstance()   {  

    if   (instance==null)  
      instance=
new   Singleton();  
    
return   instance;     }    
   
  }  

多线程环境下:在C++中安全的Double-Checked Locking模式,在java中是不安全的,详细原因与java的内存管理模型有关,请见dreamstone的文章《java中的模式——单态》
安全的实现方法是使用同步:
<!---->   public class Singleton {  
  
  
  
  static Singleton instance;  
  
  
  
   public static synchronized Singleton getInstance() {  
  
     if (instance == null)  
  
       instance == new Singleton();  
  
     return instance;  
  
   }  
 
  
 
}  

《Effective Java》中提到的另一种写法
<!---->public class Singleton {

  
static class SingletonHolder {
    
static Singleton instance = new Singleton();
  }

  
public static Singleton getInstance() {
    
return SingletonHolder.instance;
  }

}

    在介绍完13个模式之后,作者提出了 一种称为分析矩阵的方法,详细讨论不是这篇短文能说的完,有兴趣请找来此书的电子版看看。简单来讲,先从问题领域中分析出所有的变化点和共同点,观察每一种必须实现的功能并作为矩阵的行,而矩阵中的列表示特定情况中的特定实现;然后观察行,并根据场景探讨使用合适的模式;最后观察列,从整体上考虑整个问题的模式的使用。在出现的概念的场景中添加新的概念来进行设计。

    最后,作者总结了面向对象的原则:
.“对象”是负有定义良好的责任的东西
.对象对自己负责
.封装意味着
    ——数据隐藏
    ——类隐藏(藏在抽象类或者接口后面)
    ——实现隐藏(变化封装为对象进行引用)
.使用共同点/变化点分析抽象出行为和数据中的变化点
.针对接口编程
.把继承考虑为一种封装变化的方法,而不是为现有的对象制造特殊情况
.将变化点封装在一个类中,并使之与其他变化点相分离
.力求松耦合
.力求高内聚
.绝对细心地应用“一次并且只有一次”规则(只在一个地方实现一条规则)
     书本只是提供了模式的介绍和参照,真正的应用还是要靠自己日常工作中的观察和体验,我将继续在工作中理解并贯彻这些原则。      
 

分享到:
评论

相关推荐

    设计模式精解 设计模式精解

    - **缺点**:如果Facade模式设计不当,则会导致Facade对象过于庞大。 #### 2.7 Proxy模式 - **定义**:为其他对象提供一种代理以控制对这个对象的访问。 - **应用场景**:远程代理、虚拟代理、保护代理、智能引用...

    设计模式精解- GoF 23种设计模式解析附C++实现源码

    设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和...想想当时读GoF的那本圣经时候的苦闷、实现23个模式时候的探索、悟道后的欣悦,我觉得还是有这懂了设计模式,个意义。 侵删

    C++设计模式精解C++设计模式精解

    设计模式精解,设计模式精解,设计模式精解,设计模式精解

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现 #### 0. 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。通过深入理解这些设计模式,我们可以更好地进行面向...

    设计模式精解.pdf

    设计模式精解高清pdf资源

    设计模式精解

    本资源《设计模式精解》显然是针对这个主题提供的一份详细指南,对于学习和深化对设计模式理解的开发者来说,是一份非常有价值的参考资料。 设计模式通常分为三类:创建型模式、结构型模式和行为型模式。 1. 创建...

    设计模式精解-pdf.zip

    《设计模式精解》是一本深受读者喜爱的设计模式经典书籍,它为初学者和有经验的开发者提供了深入理解和应用设计模式的宝贵资源。设计模式是软件工程中的重要概念,它们是针对常见问题的经过验证的解决方案,可以在...

    《设计模式精解》.pdf

    《设计模式精解》.pdf

    设计模式精解(GoF 23种设计解析附C++实现源码)

    设计模式精解(GoF 23种设计解析附C++实现源码) 设计模式精解(GoF 23种设计解析附C++实现源码) 设计模式精解(GoF 23种设计解析附C++实现源码) 设计模式精解(GoF 23种设计解析附C++实现源码) 设计模式精解...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码.pdf

    设计模式精解- GoF 23 种设计模式解析附 C++实现源码 目 录 0 引言 ...........................................................................................................................................

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码高清PDF扫描版本

    设计模式精解chap05

    ### 设计模式精解chap05 #### 5.1 概述 设计模式作为一种重要的软件工程概念,在软件开发过程中扮演着至关重要的角色。在这一章节中,我们将深入探讨设计模式的基本概念及其在软件设计中的应用。 **设计模式的...

    GOF设计模式中英文+设计模式精解中英文

    本资源包含了GOF设计模式的中英文对照版以及一本设计模式精解的中英文版,对于深入理解和应用设计模式来说,是非常宝贵的资料。 设计模式分为三大类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...

    设计模式精解-GoF 23种设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而提出的...通过阅读《设计模式精解-GoF 23种设计模式解析.pdf》,你可以深入理解每种模式的意图、结构、实现和适用场景,提升你的编程水平。

    设计模式精解-GoF 23种设计模式精解JAVA版 PDF

    GoF的《设计模式》是所有面向对象语言(C++ Java C#)的基础,只不过不同的语言将之实现得更方便地使用。 GOF的设计模式是一座"桥" 。就Java语言体系来说,GOF的设计模式是Java基础知识和J2EE框架知识之间一座隐性的...

Global site tag (gtag.js) - Google Analytics