《设计模式精解》读后感

  模式一直是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图

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

4.Decorator模式是为现有的功能动态添加附加功能的一种方法,UML图如下

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

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

文章转自庄周梦蝶  ,原文发布时间5.17

时间: 2024-10-31 18:17:34

《设计模式精解》读后感的相关文章

求设计模式精解资料

问题描述 各位大虾,那里有<设计模式>和<设计模式精解>?如果有的话请发到我的邮箱laohuyanggp@gmail.com.谢谢了! 解决方案 解决方案二:设计模式是要靠代码练出来的,不是看出来的,没有10万行以上的代码量,不建议看"设计模式"之类的书.解决方案三:也许我可以给你发一份哦.

DockOne微信分享(一四零):Serverless云函数架构精解

本文讲的是DockOne微信分享(一四零):Serverless云函数架构精解[编者的话]继虚拟机,容器技术之后,无服务器化成为新的行业热点,无服务器云函数可以让用户无需关心服务器的部署运营,只需开发最核心的业务逻辑,即可实现上线运营,具备分布容灾能力,可依据负载自动扩缩容,按照实际调用次数与时长计费.本次主要分享腾讯云无服务器云函数在技术实现上的挑战及架构实现原理. [烧脑式Kubernetes实战训练营]本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理.Kubernet

XML入门精解之结构与语法

xml|语法 现在我们暂且使用"记事本"来创建我们的XML文件吧.先看一个XML文件: 例1 〈?xml version="1.0" encoding="gb2312" ?〉 〈参考资料〉 〈书籍〉 〈名称〉XML入门精解〈/名称〉 〈作者〉张三〈/作者〉 〈价格 货币单位="人民币"〉20.00〈/价格〉 〈/书籍〉 〈书籍〉 〈名称〉XML语法〈/名称〉 〈!--此书即将出版--〉 〈作者〉李四〈/作者〉 〈价格 货币单位

XML入门精解之文件格式定义

xml DTD实际上可以看作一个或多个XML文件的模板,这些XML文件中的元素.元素的属性.元素的排列方式/顺序.元素能够包含的内容等,都必须符合DTD中的定义.XML文件中的元素,即我们所创建的标记,是根据我们应用的实际情况来创建的.想要创建一份完整性高.适应性广的DTD是非常困难的,因为各行各业都有他们自己的行业特点,所以DTD通常是以某种应用领域为定义的范围,如:医学.建筑.工商.行政.DTD定义的元素含盖范围越广泛,那么就越复杂.  DTD可以是一个完全独立的文件,也可以在XML文件中直

XML入门精解之CSS和XSL

css|xml CSS(叠层样式表)和XSL(可扩展样式语言)都可以定义XML文件的显示,这两种方式有哪些不同以及它们在使用中的具体方法,我们将在本文给予介绍. 在XML文件中,使用的基本上是自定义的标记,显然一个浏览器是无法理解这些标记的,现在,浏览器仅仅是作为一个XML文件的解析器--只要你的XML文件是Well-Formed的,那么它就将文件原封不动地给你显示出来.在XML中内容与表现形式是分开的,在一个XML的源文件中并没有关于它表现形式的信息.XML的最大特点就是揭示了信息本身的含义,

XML入门精解-------结构与语法

xml|语法 ■创建XML文件的工具 XML文件和HTML文件一样,实际上是一个文本文件.显然大家立刻就会明白,创建XML文件最普通的工具和HTML一样,就是"记事本"了.除了"记事本"之外,当然还有一些更加方便的工具,如XML Notepad.XML Pro.CLIP!XML Editor等,这些工具的一大特点是:能够检查你所建立的XML文件是否符合XML规范.不过,现在这些工具都只有英文版的,并且需要付费使用.当然,你仍然能够使用FrontPage.DreamW

XML入门精解之结构与语法(1)

xml|语法 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  ■创建XML文件的工具 XML文件和HTML文件一样,实际上是一个文本文件.显然大家立刻就会明白,创建XML文件最普通的工具和HTML一样,就是"记事本"了.除了"记事本"之外,当然还有一些更加方便的工具,如XML Notepad.XML Pro.CLIP!XML E

《Cocos2D-X游戏开发技术精解》一1.2 Cocos2D-X引擎的来历

1.2 Cocos2D-X引擎的来历 Cocos2D-X游戏开发技术精解 Cocos2D-X游戏引擎并不是最初的版本.从名字读者就能看出最早的版本其实为Cocos2D引擎版本.追溯起来,Cocos2D引擎已经有5年的历史了.在2008年3月,Ricardo Quesada发布了Cocos2D引擎的第一个版本.最初的引擎版本定位于平面游戏框架,使用的开发语言为Python语言.在发布之初,只有235份的下载量.之后的两年间,Cocos2D引擎的受众群体依然很少,很少有游戏开发者知道. 说明: Co

《Cocos2D-X游戏开发技术精解》一1.4 下载与安装

1.4 下载与安装 Cocos2D-X游戏开发技术精解 Cocos2D-X引擎的最新版本,读者可以从官方网站来下载.这是完全免费的,地址如下. //Cocos2D社区 http://www.cocos2d-iphone.org/ //Cocos2D-X社区 http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download 图1-4所示正是Cocos2D-X的官方网站.在网站的页面中标签依次为新闻.路线图.任务.维基.下载.文档.讨论区.扩展和游戏