apache服务器下不能正常显示中文网页的解决方法

今天在redhat linux9.0下安装了apache服务器,启动后不能正常显示gb2312中文网页,可以正常显示utf-8中文网页。

 据文章:[精华] [原创]解决apache显示乱码的方法- 关怀(爱)IT人: http://www.ghitr.com/article/show-33698.html 介绍,将文件/etc/httpd/conf/httpd.conf中的“AddDefaultCharset ISO-8859-1” 改为“AddDefaultCharset off”解决问题。访问UTF-8的中文网页也没问题。

 原文章还说,改成:AddDefaultCharset GB2312 也行,试了一下,确实如此。

灰尘是计算机的大敌

摸计算机也有10年左右了,我碰到的不少所谓的问题就是把内存条拔出来用橡皮擦一擦,把显卡拔出来用橡皮擦一擦解决问题。还有比如软驱、光驱的维护也就是把灰尘用酒精擦一擦,或者再加上打点润滑油。

前几天,我家里那台Duron 700老是一开机就是黑屏,什么反映都没有,要启动多次才能把机器启动。在前一步自检通过后,又时不时出现“WINDOWS无法启动,system32\drivers\pci.sys损坏或者丢失”的提示而使系统不能启动。我在网上查了一下,从百度知道的一篇文章中WINDOWS无法启动,system32\drivers\pci.sys损坏或者丢失中得知,这个可能是内存条受灰尘影响的缘故。

想起这几天机器的不正常现象,我把内存条和显卡拔下来用橡皮仔细擦了擦后插上,然后开机,一切正常。到今天为止,电脑还是一切正常,看来又是灰尘惹的祸了。

如果您的电脑出现类似问题,不妨如法炮制。

孩子给我讲睡前故事;孩子不肯进教室和喊老师了

现在,接连几天晚上,孩子不再要求我给她讲睡前故事,而是她给我讲。

她给我讲《小蝌蚪找妈妈》,说的是一口标准的普通话,有声有色,语气抑扬顿措,虽然故事还讲得不是很流利,但是总体效果我感觉比我给她讲讲得好。我给她讲是把故事按字复述一遍,而她给我讲是带着感情的。

睡前,孩子除了给我讲故事,她还要给我唱歌跳舞,而且是在被窝里唱歌跳舞(littlebat注:跳舞的五笔编码为:KHRL)。她在被窝里睡着,一边唱,唱的是《我和奶奶去买菜》、《我在马路上捡到一分钱》等等,还一边手舞足蹈,忙得不亦乐乎。真是一个快乐的小孩。

不过,这几天,我发现孩子上学不肯进教室,尤其是老师在教室里的时候,她也不像原来那样主动的高高兴兴的喊“老师好”了,而是等老师叫她她才进教室。也不知道究竟是怎么一回事?我问孩子为什么她不肯进教室,她说她“不好意思”。我怀疑是上次老师让我写一篇育儿的心得张贴到孩子们的教室门口,我把上次写的那篇“一次成功的安抚孩子和一次成功的劝服孩子”打印了交给老师算是交差(只是日记,不含后来添加的那篇日记的评论),也许是大家读了那篇日记后,对孩子的态度在无形中有了微妙的变化,而这种变化被孩子敏锐的捕捉到了,于是,就出现了不肯进教室,不喊老师的行为。当然这只是我的猜测。

不过,为保险起见,我要求老师把贴在教室门口的那篇我的育儿日记撕下来。老师说育儿心得是一周一换,下周就会给我撤下来。

孩子的不肯进教室和喊老师的行为继续观察中。。。

用Nero制作标准ISO文件和其它类型镜像文件的方法(转帖)

转自:用Nero制作标准ISO文件的方法:http://dgz.qhhndx.com/blogview.asp?logID=4

用Nero制作标准ISO文件的方法

  用Nero刻录ISO文件大家都会,不过知道怎样用Nero制作ISO文件的却好像没有多少,偶在这里介绍一下,呵呵。

 

  首先启动Nero,然后在Nero的“烧录器”菜单中选择“选择烧录器”选项。在“选择烧录器”选项中,我们选择使用“Image Recorder”作为要使用的烧录机。

 

  接下来我们要作的就是新建一个烧录任务,建立好烧录任务后,选择“文件”菜单中的“写光盘”选项,然后选择“写入”。这时Nero会出现一个提示你“保存映像文件”的对话框,在“保存类型”中选择“ISO Image Files”,最后选择“保存”即可。

(littlebat注:在保存类型中可以选择其它映像文件类型,比如:NRG)

********************************************************

相关的帖子还有另一篇可以参考一下:

用Nero制作镜像文件: http://soft.zol.com.cn/2004/0111/144321.shtml

用Nero制作镜像文件

类型:转载 作者:wufang 日期:2004-01-11 10:36:18

--------------------------------------------------------------------------------

   Nero不仅是一个优秀的刻录软件,还是一个很优秀的镜像文件制作工具,你可以用它来制作镜像文件,包括光盘镜像文件和硬盘镜像文件。具体是如何实现的呢?随我来看看你就知道了。

     1.制作光盘镜像文件

在主菜单上的“刻录器”菜单中选择“选择刻录器”命令,找到“Image Recorder→Virtual Device”并启用它。退出精灵模式,在“新建CD”中选择“复制光盘”,在“映像文件”选项中选择镜像文件保存位置及文件名,然后取消“复制光盘后删除映像文件”,在“刻录”选项勾选“写”。此时“确定”按钮变成“复制”按钮,点击“复制”按钮,放入源光盘,即可将光盘镜像文件复制到你设定的目录下了。

     另外还有一种方法,点击“选择刻录器”命令后选择一个刻录机,选择“复制光盘”,在“刻录”选项中勾选“模拟”,并去掉“写”前面的对钩标记(这一步可不能少哟!)。然后点击“模拟写入”按钮来进行光盘复制,源盘复制完成后,在弹出的“等待媒体”窗口中选择“取消”,然后在前面设置的“映像文件”保存位置中就可以找到以NRG为后缀的文件,此文件即为制作的光盘镜像文件(如图1)。

 

     2.制作硬盘镜像文件

Nero同样可以将硬盘上的文件制作为镜像文件,这个制作过程与制作光盘镜像文件不同。新建一个“数据光盘”,将需要制作镜像文件的源文件或文件夹拖到编辑框中。添加完成后,即可开始“刻录”,在弹出的“刻录光盘”窗口中选中“建立映像文件”,在弹出的“保存镜像文件”窗口中选择镜像文件的保存目录、名称以及镜像文件类型,点击“保存”即开始刻录(如图1)。刻录过程结束后,硬盘文件镜像即制作成功了。

 

(小提示:制作硬盘镜像文件不仅仅可以制作成NRG一种格式,还可以制作成最常见的ISO格式,你可以在镜像文件类型中进行选择。 )

一次成功的安抚孩子和一次成功的劝服孩子

女儿是比较任性的,只要她认定的事,不按她的心愿来做,往往弄得小孩哭闹,大人生气的情况。但是,前两天进行了一次成功的安抚活动和一次成功的劝服活动。关键在于:

1、要有爱心、耐心和宽容心;

2、要站在孩子的角度替孩子作想;

3、孩子是讲道理的;

4、不要动手打孩子。

具体情况如下:

一天晚上,孩子要自己动手拿起小铁锤和小钉子替她的堂姐做一把木剑,而且坚决不让我们大人帮忙。我知道她是做不出来的,但是让她尝试一下。我出去办事去了。

回来后,我发现孩子在茶几上用小铁锤钉木剑,肯定把茶几面要弄坏。她的外婆在旁边看着她,没有阻止,我想她是阻止了的,但她拗不过孩子。

1)、我先反复劝孩子不要钉,她不听。压下动手打她的火气,自从许久以前,我下决心不再打孩子后,我最大的动作就是扬起手,吓吓她;

2)、我明白现在孩子的心里也很窝火,自己怎么也做不成这把木剑。我把她手中的东西强行给她拿了,她当然不依。又哭又闹;

3)、我把孩子抱起来,反复给她讲,这样做会把茶几钉坏。并自问自答的给她表演假如妈妈看见她把茶几钉坏了的反应:

  “是谁把茶几钉坏了?!”

  “桥桥。”

  “这么好的茶几给钉坏了,给我打!”

然后把就假装用手轻轻打她。然后我就站在她的心理的角度安慰她。

  “我知道桥桥给姐姐做的剑没做好,心里着急。明天爸爸给你做一个。。。”

   。。。

一会儿,孩子不哭闹了,不好意思的在我怀里撒娇。结果第二天孩子好像忘了这件事,我也就没有给她做木剑了。现在想来,尽管孩子已经忘记了,我应该主动提出来给孩子做一把木剑。让孩子知道大人说话是算数的,尽管她自己已经忘记了。

第二天,孩子不愿扎头发,大人勉强给她扎了一侧,她就挣脱跑了。我去把她追回来,不管她又哭又闹,把她抱到梳妆台前,让她看自己头发乱糟糟的样子。她看着看着就同意我们给她扎头发了。所以,孩子是讲道理的。

之所以详细记下成功的安抚和劝服行动,是因为原来我往往处理不好这样的“冲突”,现在有点心得了,赶快记在这里,防止忘记了,以免以后犯同样的毛病。弄得大家都不舒服。而且,我感觉有必要开一个“家庭会议”,把自己的心得同大家分享一下,并统一一下对孩子的教育策略和具体操作,免得她钻我们的空子,和纠正一些家庭成员不当的对待孩子的思想。我想,在这样的思想指导下,我们家里基本上应该只有孩子的笑声,没有孩子的哭声的:)

春天疾病多,幼儿园统一通知上周星期五放假去防疫站给孩子打了预防“麻疹和腮腺炎”的疫苗。

孩子现在非常大方,小朋友到家里来玩,苹果、奶粉自己去拿出来一人一个,一人一小袋,大人说苹果太大了让她和小朋友分着吃也不行。当然,我们大人对这种大方的态度应持肯定态度。

今天早上,孩子起来自己穿好了衣服。我认真的夸讲了她。天气比较热了,孩子的衣服穿得少了,应该让她自己穿衣服了。关键是培养她的自理能力。

星期五那天打疫苗回来的路上,和她同行的一个小朋友趁售货员不注意偷偷拿了一样东西跑掉了,而那个小朋友的婆婆还在笑,真不知该怎么给那个小朋友的婆婆说。当我们孩子的婆婆回来给我说起这事,我严肃的说我们孩子坚决不能有这种行为。我们孩子的婆婆和爷爷劝我不要去给那个拿东西的小朋友的婆婆说,说这样别人面子上过不去。我心里觉得欠欠的,也只好作罢。

批量更改QQ聊天场景mp3音乐文件名为其所在目录名

批量更改QQ聊天场景mp3音乐文件名为其所在目录名

QQ的聊天场景中(在目录:IMScene/Scene中)的mp3音乐文件名是像这样的E00001.mp3的符号命名(老婆原来刻苦聊天时在聊天场景中攒下了200首mp3,IMScene目录有700多M),我把这些文件在linux下mp3blaster下播放时看不到音乐的中文文件名。碰巧聊天场景中的每一个目录的名字就代表了其下的音乐的名字,于是,我花了一个下午写了下面这个bash脚本来把mp3音乐的名字改成跟它的目录名一样。一方面是有了中文名字的音乐文件,一方面学习一下linux的bash脚本写作。我想,在windows下用批处理脚本也应该能完成这个工作。但是我学电脑的时候已经过了microsoft的dos时代,就没有学过批处理。倒是linux下的批处理好像还在类unix世界广泛使用。

当然,我很少用和写bash脚本,如果哪位同志看到其中的错误、不当、和可以改进之处请不吝赐教。谢谢。

使用的关键知识点:

1)、for循环遍历目录;

2)、文件相关判断;

3)、字符串比较与数字比较的区别;

4)、对文件名带中文和文件名中带有空格的文件进行操作时,必须对文件名加上双引号;

一些小技巧:

1)、控制脚本只在这个目录执行一次;

2)、控制一个目录下多个类似文件的改名;


#!/bin/bash

# rename.sh

# Rename the file's name as its directory name, like this:

# Rename "/home/m/Scene/求佛/E00001.mp3" to

# "/home/m/Scene/求佛/求佛.mp3"

NOARGS=65

CONFIRM_FAIL=66

RUNONCE_FLAG=67

# Input the first level directory.

# The dirctories structure is like this:

# first level directory

#    second level directory 1

#       files in second level directory 1

#    second level directory 2

#       files in second level directory 2

#    second level directory 3

#       files in second level directory 3

# ...

if [ $# -lt 3 ]

then

   echo "Usage: $0 dir redir suffix ..."

   exit $NOARGS

fi

dir=$1

redir=$2

suffix=$3

echo "your first argument is $dir"

echo "your second argument is $redir"

echo "your third argument is $suffix"

if [ $dir != $redir ]

then

   echo "Usage: $dir must equal to $redir for confirming..."

   exit $CONFIRM_FAIL

fi

if [ -e $dir/runonce.flag ]

then

   echo "Usage: This program can only run once!"

   exit $RUNONCE_FLAG

fi

directorys=$dir/*

for directory in $directorys; do # Find all second level directories

     if [ -d "$directory" ] # Note! It must add double quote before

                            # and after $directory, otherwise, it will

                            # report error if there is blank or chinese

                            # in $directory.

     then

        echo "$directory is a directory"

        count=0

        for file in "$directory"/*$suffix; do # Find the mp3 file in second

                                              # level directory

           if [ -f "$file" ]

           then

              echo "$file is a file"

              dirname=${directory##*/} # get the second level directory name

                                       # without its prefix path like /home/m/

              echo "$file's directory is $dirname"

              if [ $count -gt 0 ]

              then

                 echo "rename $file to $directory/$dirname$count$suffix"

                 echo " rename #$count file begin..."

                 mv "$file" "$directory/$dirname$count$suffix"

              else

                 echo "rename $file to $directory/$dirname$suffix"

                 mv "$file" "$directory/$dirname$suffix"

              fi

              let "count = count + 1"

              echo "rename $count file ok" 

           fi

        done

     else

        echo "$directory is not a directory"

        echo "Usage: $0 dir redir ..."

     fi

done

# Write runonce flag file into the first level directory

echo "Run rename.sh once at `date`" > $dir/runonce.flag

exit 0

女儿爱与同龄孩子玩了;幼儿园加强与家长的协同教育

女儿近况总结

近段时间来,孩子好像特别喜欢与她同龄的院里的小朋友玩了。而且,常常是一回家就去找小朋友玩,连饭也顾不得吃,到了吃饭时间也叫不回来,常常被我们大人强迫的押回家。而原来她是喜欢同比她大几岁的哥哥姐姐们一起玩的。

现在孩子倔强的脾气好像有了一点好转,比如有时上学她要求给她买东西,我们给她说当时不买,她也能听得进去了。

原来看过很多遍的动画片她仍然能看得两个小时不动地方。还有,孩子现在对家里的电器插座突然有了兴趣,喜欢自己动手去插。我们在再三严厉的说她的同时,把所有移动的插线板都挂在了高处。

因为单位现在的纪律强调得比较严,相应的带来的一个好处是孩子也总是能准时到幼儿园了(因为我上班的地方与孩子上幼儿园的地方顺路)。看来迟到也不是不能避免的嘛。

原来女儿是不扎头发的,现在也渐渐习惯我们给她扎头发了。

在幼儿园的教育上,好像自从他们使用了那种新教材后,幼儿园与家长在孩子的教育上的沟通要强些了。比如,上周孩子带回来两个题目:一是和孩子一起在杂志、报纸上搜集一些海陆空的交通工具图片;一是带孩子到车站去了解乘车的一些问题,让孩子熟悉交通规则等等。原来,他们上一周的课程以交通工具为主题。在原来过去的一年半的幼儿园时间里,我们和幼儿园的沟通是很少的。

最近两个星期天我们都带孩子到野外去玩了的,这种户外的活动还是要坚持的,多亲近点大自然。我听说人是从绿色的森林里走出来的,到现在成天住在钢筋混凝土的灰色的森林里,差不多快忘了人是从哪儿走出来的。

前段时间读了一篇<<读者>>上的鲁迅的孩子周海婴的回忆录,里面有一处写鲁迅先生对他幼年的教育上,大意是如果不是非常过分的要求,鲁迅先生都是十分“纵容“他的。我想,孩子在一种宽松的、爱的氛围中成长,有个快乐的童年是不会错到什么地方去的吧?这篇文章在我的心里好像对我前些时间萌发的对孩子宽松些的想法提供了一点佐证。人一辈子是很辛苦的,幼年、童年都没有一个大体上快乐的记忆。我觉得是不当的。

GoF的《设计模式》之入门介绍

转载请注明本文原始出处:GoF设计模式之入门介绍: http://java.learndiary.com/diaries/3150.jsp。本文在原始出处随时更新,欢迎批评指正和讨论。

--JAVA学习日记 littlebat 2007.04.02 16:33

正文:

*********************************************************************

用了一周多时间把这章看了一遍,并结合其中的内容把自己原来记的学习Thinking in Patterns with Java的日记复习了一下,感觉对各种设计模式的印象又清楚了一些,提起某个模式的名字大概知道了是怎么一回事。下面记下学习这章中的一些知识点和心得如下:

要做一个好的设计是困难的,设计模式的作用就是把这些被反复证明了的好的设计以一个统一的形式归纳记录下来。一旦一个设计的“套路“被证明是有效的,就像一个“浪漫小说“那样有一套固定的模式,可以反复的套来用。GoF总结的设计模式只是那些专家们知道的一个片断,还有像分布式编程、实时编程、设备驱动编程、面向特定应用领域编程等等的设计模式还有待别人去归纳整理(littlebat注:不知道这些领域的设计模式现在有没有?情况如何?学习领域现在不知有没有设计模式?也许学习日记可以在这方面看一看)。

1、什么是设计模式?

(The design patterns in this book are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context.)设计模式是在特定的环境中用来解决通用的设计问题的相互交流的对象和类。它的粒度不是细到讲怎么样实现一个链、一个哈希表,也不是粗到整个应用或者子系统。一个模式有4个基本元素:名称、解决的问题、解决的方案、结果。设计模式的实现的复杂程度跟选择的实现语言关系很大,所以有的设计模式在一种语言中实现起来很复杂,而在另一种语言中实现起来很简单,甚至有些模式已经被某种语言内置支持(littlebat注:像在Thinking in Patterns with Java中读到的那样,像Iterator, Observer, Adapter, Proxy等模式就在Java语言中内置支持,另外,Java中的clone()方法是否是prototype模式、Java的package是否是Facade模式、而Java的序列化技术是否是Memento的模式、Comparator是否是Strategy模式的内置支持还不是很清楚?)。这本书主要是采用C++(littlebat注:要复习一下c++语法了) 和 SmallTalk来实现例程。

2、Smalltalk MVC里的设计模式:

这一节分析了SmallTalk的MVC框架(littlebat注:Java中的Struts也是一种MVC实现)所涉及到的设计模式包括:Observer, Composite, Strategy, Factory method, Decorator等等。

3、描述设计模式:

这本书以一套固定的模版来描述一个设计模式,包括:名称和分类、目的、别名、动机(Motivation)、适用性、结构、参与的对象和类、参与者的交互、后果、实现、例程、已知的使用例子、相关模式。(littlebat注:其中为阐述结构,使用了现在UML的前身包含的一些技术,如OMT,交互图,序列图等等。。。我想,这些技术与UML应该差不多,有些区别通过看其它相关的内容也应该可以知道的。另外,UML好像是1997年才正式发布的?)

4、设计模式的目录:

这一节列出全部23种设计模式的目录和简短的描述,Abstract Factory (87), Adapter (139), Bridge (151),

Builder (97), Chain of Responsibility (223), Command (233), Composite (163), Decorator (175), Facade (185), Factory Method (107), Flyweight (195), Interpreter (243), Iterator (257), Mediator (273), Memento (283), Observer (293), Prototype (117), Proxy (207), Singleton (127), State (305), Strategy (315), Template Method (325), Visitor (331)。

组织目录:

GoF主要用两个标准来划分设计模式,一个标准是目的,分为:创建、结构、行为的目的。如下:

创建的目的:

Factory Method (107)

Abstract Factory (87)

Builder (97)

Prototype (117)

Singleton (127)

结构的目的:

Adapter (139)

Bridge (151)

Composite (163)

Decorator (175)

Facade (185)

Proxy (207)

行为的目的:

Interpreter (243)

Template Method (325)

Chain of Responsibility (223)

Command (233)

Iterator (257)

Mediator (273)

Memento (283)

Flyweight (195)

Observer (293)

State (305)

Strategy (315)

Visitor (331)

第二个分类的标准是模式使用的范围,包括:类的范围、对象的范围。如下:

类的范围:

Factory Method (107) Adapter (139) Interpreter (243)  Template Method (325)

对象的范围:

Abstract Factory (87)

Builder (97)

Prototype (117)

Singleton (127)

 Adapter (139)

Bridge (151)

Composite (163)

Decorator (175)

Facade (185)

Proxy (207)

 Chain of Responsibility (223)

Command (233)

Iterator (257)

Mediator (273)

Memento (283)

Flyweight (195)

Observer (293)

State (305)

Strategy (315)

Visitor (331)

书中还提出了也有其它的方式来组织设计模式,如有的设计模式经常放在一起用,有的可以互换,有的设计结果的结构相似等等。并特别的提出了一种根据设计模式间的关系来组织目录的方式,这就是很重要的设计模式的关系图(Figure 1.1,我把这张图放在了后面的附图中:图1.1)。

(littlebat注:我觉得关系图中的关系主要是一种模式使用了另一种模式的关系,如:图中的Composite模式使用了Iterator模式来遍历子对象,Iterator使用了Memento来保存遍历的状态。

另外,在Thinking in Patterns with Java中的分类是根据设计模式解决问题的性质,我本来以为在GoF的设计模式中没有按问题分类,结果是GoF把这种分类放在了设计模式怎样解决设计问题的下一节中。

另外,我发现了一些现在看来在这两本书中有点矛盾的地方:如在Bruce先生的书中说Decorater模式是解决类太多的问题(Thinking in Patterns chapter 9: too many),Bridge模式主要在用于代码的组织上(Thinking in Patterns chapter 10: Connecting different types),而在GoF的书上把这两种模式都归为在对象范围内应用的模式。也许他们是从不同的角度来说的,还需要进一步学习。

5、设计模式怎样解决设计问题

这一节是这一章中内容最多也算最重要的一节吧。它讲了oop设计者可能面临的各种设计问题和设计模式怎样帮助设计者解决这些设计问题。这些设计问题如下:

1)、找出恰当的对象

2)、决定对象粒度

3)、指定对象接口

4)、指定对象实现

   (1)类继承对接口继承

   (2)编程到接口而不是实现

5)、使重用技术运用起来

   (1)继承对组合

    要更多的使用组合

   (2)代理

   (3)继承对参数化类型

    取决于实现的系统

6)、关联运行时和编译时结构

7)、设计成适应改变的系统

   在这一节中指出了一些系统不易改变(灵活性差,稍有扩展和改变引发代价较大的重新设计)的问题和针对相应问题的设计模式:

    (1)精确的指定类来创建对象

       Design patterns: Abstract Factory (87), Factory Method (107), Prototype (117).

    (2)依赖特定的方法

       Design patterns: Chain of Responsibility (223), Command (233).

    (3)依赖硬件和软件平台

        Design patterns: Abstract Factory (87), Bridge (151).

    (4)依赖对象表现或实现

        Design patterns: Abstract Factory (87), Bridge (151), Memento (283), Proxy (207).

    (5)算法依赖

        Design patterns: Builder (97), Iterator (257), Strategy (315), Template Method (325), Visitor (331).

    (6)紧耦合

        Design patterns: Abstract Factory (87), Bridge (151), Chain of Responsibility (223), Command (233), Facade (185), Mediator (273), Observer (293).

    (7)用继承扩展功能

        Design patterns: Bridge (151), Chain of Responsibility (223), Composite (163), Decorator (175), Observer (293), Strategy (315).

    (8)不能方便的改变类

        Design patterns: Adapter (139), Decorator (175), Visitor (331).

   而对于这种改变灵活性的要求程度如何取决于所实现的系统,按灵活性要求从低到高分为3类系统:

    (1)应用程序

    (2)工具包

    (3)框架

     框架和模式的区别:

          1>、设计模式更抽象

          2>、设计模式是要小一些的结构元素

          3>、设计模式更通用化一些

这一节可以同Bruce先生从解决问题对设计模式进行的分类比较着看,Bruce先生根据设计模式解决的问题分成:

1>、Object quantity: Singleton

2>、Object decoupling: Proxy, State, Iterator

3>、Factoring commonality: Strategy, Policy, Template method

4>、Encapsulating creation: Factory method, Abstract factory

5>、Specialized creation: Prototype, Builder

6>、Too many: Flyweight(too many objects), Decorator(too many classes)

7>、Connecting different types: Adapter, Bridge

8>、Flexible structure: Composite

9>、System decoupling: Observer, Mediator

10>、Reducing interface complexity: Facade

11>、Algorithmic partitioning: Command, Chain of responsibility

12>、Externalizing object state: Memento

13>、Complex interactions: Visitor

14>、Multiple languages: Interpreter

现在看来,好像Bruce先生的针对解决问题的分类的可操作性要简单易懂一些。我印象比较深刻的就是那个Too many,例如:如果我在一个设计对应于现实对象的静态结构中找出了过多的类(像Bruce先生举的那个咖啡馆里的咖啡种类),我可以第一时间想到:这么多的类是不是用Decorator减少一些哟?当然,我还没有真正的实践过设计模式,也许真到那时使用这些设计模式也不是这么一回事。先记在这里回头再说吧。

另外,在这一节中有一些东西需要更进一步的学习,如class和type的区别,UML和OMT的区别?怎样用设计模式解决问题?还有,这一节的内容很多,不少东西都是粗粗读过,还需要在读完全书后再回过头来反复读,正如作者说,这不是一本看完一遍就扔在一边的书。

6、怎样选择一个设计模式

1)、想想设计模式怎样解决设计问题的

2)、查一下设计模式的意图

3)、研究一下设计模式的相互关系

4)、研究一下目的类似的设计模式

5)、检查一下引起重新设计的原因

6)、考虑一下你的设计中的变化因素

下面是书中的一个表,列出3种目的的设计模式可以解决的系统中的变化因素,描述格式是:设计模式      设计中可能变化的方面

1>,Creational

Abstract Factory (87) families of product objects

Builder (97) how a composite object gets created

Factory Method (107) subclass of object that is instantiated

Prototype (117) class of object that is instantiated

Singleton (127) the sole instance of a class

2>,Structural

Adapter (139) interface to an object

Bridge (151) implementation of an object

Composite (163) structure and composition of an object

Decorator (175) responsibilities of an object without subclassing

Facade (185) interface to a subsystem

Flyweight (195) storage costs of objects

Proxy (207) how an object is accessed; its location

3>,Behavioral

Chain of Responsibility (223) object that can fulfill a request

Command (233) when and how a request is fulfilled

Interpreter (243) grammar and interpretation of a language

Iterator (257) how an aggregate's elements are accessed, traversed

Mediator (273) how and which objects interact with each other

Memento (283) what private information is stored outside an object, and when

Observer (293) number of objects that depend on another object; how the dependent objects stay up to date

State (305) states of an object

Strategy (315) an algorithm

Template Method (325) steps of an algorithm

Visitor (331) operations that can be applied to object(s) without changing their class(es)

7)、怎样使用一个设计模式

讲当你选择了一个设计模式后怎样使用它。

    (1)把这个设计模式通读一遍

    (2)研究结构、参与者、交互部分

    (3)看例程部分

    (4)为设计模式中的参与者选定名字

    (5)定义类

    (6)为设计模式中的方法(操作)定义具体到应用的名字

    (7)实现模式中的方法

最后,这节讲了一个非常重要的观点,设计模式不能滥用,因为为达到灵活性等设计模式的使用常引入间接的附加的层次,这使系统变得复杂或(和)影响性能。只有设计模式提供的灵活性是系统真正需要的时候才使用它。后面的章节对评价一个设计模式的损益很有用。

*********************************************************************

附图:图1.1