Thinking in Patterns Chapter 12: System decoupling

Thinking in Patterns with Java V0.9: Chapter 12: System decoupling: TIPatterns.htm#_Toc41169737

1, Sections:

Observer. 95

Observing flowers. 97

A visual example of observers. 101

Mediator. 103

Exercises. 104

2, The main content and feeling:

This is a really difficult reading experience for me in this chapter's

learning. After three times' reading, at last, I can say, Observer Pattern, I

got it.

1), Observer Pattern

From my own understanding with a simplest instance, Observer Pattern can be used in the situation below:

I am prepairing for dinner, I am an Observable; My mother is reading a book in the book room and waiting for dinner, She is an Observer.

When the dinner is ready, I send her a signal: A dinner begin! From my

Observable role, I just:

 setChanged(){/*dinner has ready*/}

 super.notifyObservers(); //notify her the dinner has ready

And she just:

update(){/* put the book into desk, go the dinner room to eat */}

A key of this pattern must be aware:

The Observable object's class you used must inherit from the base class:

java.util.Observable !

Because, in the base Observable class, notifyObservers() don't call

setChanged() method, before you notify the Observer, you must call it in you

own derived-class which inherited from Observable base class; Otherwise,

although you have notified Observer, they notice that "changed" flag hasn't

changed, they don't update() anything. Just an Observer say: yes, I get you

notify, but, I see you don't change anything, so, I needn't do a useless

thing.

Note, in the book, Bruce say:


To get an effect, you must inherit from Observable and somewhere in your derived-class code call setChanged( ). This is the method that sets the ?changed? flag, which means that when you call notifyObservers() all of the observers will, in fact, get notified. In the example above setChanged( ) is simply called within notifyObservers( ), but you could use any criterion you want to decide when to call setChanged( ).

I understood his meaning is: You can put the setChanged() code in anywhere of

your code. But, I think if you want Observer update() himself, you must do a

setChanged() before you call notifyObservers() in the

Observable object. Is there any wrong with me?

 

Another point is important of my understanding is:

One Observable Object can be tied with many of different Observer Object

dynamically. Just like the book's example below:


   ...

    f.opening().addObserver(ba.openObserver());

    f.opening().addObserver(bb.openObserver());

    f.closing().addObserver(ha.closeObserver());

    f.closing().addObserver(hb.closeObserver());

   ...

At last, the Observer Patterns descripted in this book is taken the use of standard java.util library. Of course, it must there are some other Observer Pattern implementions need me to learn.

2), Mediator


Sweep coupling under the rug, how is this different from MVC?

MVC has distinct model and view; mediator could be anything. MVC a flavor of

mediator

Why no more words in pattern of Mediator? So, I can't understand what is

Mediator. And, the sentence above I can't understand it yet. 

3, Questions about programming:

1), What is "callback"?

2), Notice, however, that the control of the flag?s state is protected, so that only an inheritor can decide what constitutes a change, and not the end user of the resulting derived Observer class.

   Who is "end user"?

3), Then it moves through the set and calls back to the update( ) member function of each Observer.

  Is there any "call back" action to the update() method of observer when observed object notify changes to observer?

4), What is Mediator Pattern?

5), Exercises.

4, Questions about english language:

1), Strange words:

Document-View Architecture, plot, textual, facilitate, potentially,

surrounding, observable, constitutes, in case, phenomena, have access to, come

in handy,

2), Difficult sentences:

Sweep coupling under the rug, how is this different from MVC?

MVC has distinct model and view; mediator could be anything. MVC a flavor of

mediator.

According to my learning, Sweep coupling under the rug, just like:(From

http://dict.cn)

sweep the dust under the carpet:

把不愉快的事情掩盖起来

 

                                     incomplete

搞懂java中的synchronized关键字

实际上,我关于java的基础知识的90%以上都来自Thinking in Java。对于其中的synchronized关键字,当时就是浏览一下,大概知道意思,也没有细看。后来一直没有用过这个关键字。昨天看Thinking in Patterns with Java中的Observer模式,看了其中的Observable类的源码,发现里面几乎所有的方法都用了synchronized关键字(不是全部),其中个别用了synchronized(this){}的区块。于是,我发觉有必要好好理解一下这个关键字了。

我再次看了侯捷译的Thinking in Java第二版中文版,得到有关synchronized的如下信息:

1、synchronized关键字的作用域有二种:

1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;

2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。

2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;

3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;

4、疑问:

我知道了有static区块(其中的加载时机好像也不清楚,需要学习一下,原来看Thinking in Java好像是说: static区块加载的时机是类的一个对象实例创建或类的一个static方法被访问,但是我今天早上看了javaeye.com上面的一个关于“<static块到底什么时候执行?-eway -JavaEye技术社区>”的文章后又有点迷糊了:),也许,需要认真学习一下JVM的内在机制才是理解这类问题最根本的途径),也有synchronized区块,那么,有synchronized static 区块吗?意思是问:有没有一个类作用域内的synchronized区块?

 

孩子的话我最懂!

一个令我感到有点骄傲的是:孩子的话我最懂!平时,她说的话,她的外婆和婆婆、甚至她的妈妈听几遍才能听得懂的话,基本上我一遍就能懂。也许,是我的耳朵比较灵敏吧:)

现在,自从上次孩子不在学校吃午餐后,每天早上送她去上幼儿园她都要问:今天哪个来接我?有时甚至中午送她去幼儿园都要问。可见,她是非常害怕在幼儿园里吃饭的,她怕一个人被留在幼儿园没人来接她。

孩子的记性也特别好,比如,我今天答应她,今天不买零食,明天给你买。于是,第二天,她就会问:爸爸,你昨天说的要给我买吃的。于是,我在惊叹于孩子的记忆力的同时,就不得不给她买了。

我们的孩子的所有情绪都会立即表现出来,所以,她说不喜欢我就是当时她的情绪对我不好。并不代表是一个她头脑里固定的概念,只是她当时心绪的反应。

我们孩子现在睡觉还可以了,原来睡觉不允许我们给她脱外衣,连身滚,而且睡得迟。现在一般9:00左右就睡了,睡之前也允许我们给她把外面的衣服脱了,只留内衣睡。早上也基本上能按时起来。只是有一点,她睡觉时爱把手伸出来,把手冻得冰冷。

这段时间,孩子在学写数字5了。在学校里,老师要求写一篇5。可能是她写的速度慢了,写不完,于是,在本子的后面全用叉填满。也算是写满一篇吧。

上次,连衣服称重有34斤了。是说,抱着去幼儿园挺累的。她不肯走路,如果不用自行车送她去幼儿园,就只有抱着或背着去了。送她去幼儿园是我的事,因为我上班就要经过她的幼儿园。

我们孩子的声音很大,说起话很响亮,有时争论起什么来,都怕她把嗓子震坏了。是否该教她说话、唱歌不要那么大声?又觉得好像不合适。

at last, I found a reason to restart english learning

I can't remember that I have broken english learning how long time. But, this time, I have to restart english learning again. There is a good reason is: Next April, I will participate english test for 职称评定(professional rank and titles grading, I don't know if it is right).

Although, I have heard maybe the english test will cancel in a day, but, we can't know when this day come. So, a best way is to learn it, and prepair for english test.

Which way should I use to learn it?

1, write a sentence every day;

2, learning english program tutorial continuely, like Thinking in Patterns with Java;

感觉学习日记的设计形式有点笨重了

学习日记软件的帖子组织形式有点笨重,很多时候,日记就那么一两句话,而如果作为一篇日记放在一页的话,觉得有点太浪费空间了。一个页面的大部分内容是导航,实际的内容很少。像http://www.43things.com等网站一个目标就是一句话,而下面的每日的记录都在同一页的这个目标下面。

这两天,有个很明显的感觉就是:难以动手记点东西。不是不想记,而是由于上面的原因,觉得一两句话就记一篇日记不好。

不过,学习日记已经设计成这个样子,除非以后重写程序,这样的形式还是要继续的。

这里采取一个变通的方式:

在大目标下,征对自己当前正在着手解决的问题写成一篇日记,后续的思考记成日记的评论,这样,一篇日记在一个页面就不过分了。

另外,在目标下,开一个帖子,名为:JAVA小技巧汇总,育儿每日一句,英语每日一句,eclipse使用小技巧,等等。

这样,我就不会有下手为难的感觉了。

毕竟,我不是在写教学文章,我在记日记,记自己的点滴心得和一步一步的足迹。

以后,学习日记重新设计的时候,要考虑把帖子的组织形式做成大众化,轻量级的,使所有的朋友乐于留言和互相鼓励。只有这样,才能实现我们提倡的学习方式:分享目标,分享快乐。

静态页面嵌入jsp动态页面的一些总结和疑问

在一个实现将JSP动态页面转为静态的方案(转帖)中后面的那种方法基本上完成了本站的动态页面静态化工作,下面是一些总结和疑问。希望能给碰到类似情况的朋友一点启发。也希望有朋友能够启发一下我在文中提到的疑问。谢谢。

1、页面菜单上部的用户信息是用iframe嵌入的,像下面:


   <!-- show user state with iframe framework -->

   <iframe frameborder="0" name="user_state" width="771" height="30" scrolling="no" src="/common/userState.jsp"></iframe>

/common/userState.jsp是从当前session中取出用户的相关信息显示出来。

不过,我发现: 在firefox中位置不动的信息条在IE中却可以用鼠标上下移动,而且,始终位置在底部,还把字脚给挡住了,搞不懂怎么做了?(注:这个问题已经解决,见:怎样控制iframe内嵌网页的位置

,2006年12月29日10:30分, littlebat)

2、显示日记或目标的帖子下面的游客回复框也是用iframe嵌入的,像下面:


   <iframe frameborder="0" name="guest_reply" width="771" height="456" align="center" scrolling="auto" src="/common/guestReply.jsp?parentID=<c:out value=""/>&defaultTitle=<c:out value=""/> "></iframe>

这个有几点自己的总结:

1)、url中文参数的传递要编码:如:


<%

  //encode default title

  String oriTitle = "re:" + ((ArticleInfo)request.getAttribute("aGoal")).getArticleName();

  String encodedDefaultTitle= URLEncoder.encode(oriTitle, "UTF-8");

  pageContext.setAttribute("encodedDefaultTitle", encodedDefaultTitle);

%>

使用时再解码,如:


        String encodedDefaultTitle = request.getParameter("defaultTitle");

        String defaultTitle = URLDecoder.decode(encodedDefaultTitle, "UTF-8");

        pageContext.setAttribute("defaultTitle", defaultTitle);

2),当前页面处理的信息可以放入pageContext中(如:pageContext.setAttribute("defaultTitle", defaultTitle);),它的作用域应该是当前页面,可以用 <c:out value=""/> 之类的技术取出来,jsp的方法不知道。

3),为了使嵌入的jsp页面中的form提交后能够返回它的被嵌入的_parent页面,可以在form提交时加 target="_parent"解决,如下:


<html-el:form action="postGuestArtAction.do?typeID=3&goalID=" target="_parent" method="POST">

...

</html-el:form>

3、页面计数:

用script做的,如下:


<script language="javascript" src="/count.do?artID=<c:out value=""/>"></script>

疑问:

1)、怎样在script中调用程序,得到当前页面的实时点击数并写入页面的合适位置?上面的功能只能计数,然后统一生成页面更新计数;

2)、本来上面的count.do可以用count.jsp来做的,也许这样还要好点,但是我不知道怎样在jsp中调用struts中的数据源?用jdbc连接常常形成连接数超出空间允许的最大值而不能正确计数;

在struts的action中这样调用数据源:javax.sql.DataSource ds = getDataSource(request, "myDataSourceName");

4)、当用*.jsp后缀名作为静态文件时,提交新日记或目标后,第一次查看会有编译等待jsp的时间,但是写日记和目标毕竟是很少时候,99.99%的时候还是在看的。选用*.jsp是我动过脑子的,最终要是证明错了我也不后悔。因为,我曾经努力过。

4、因为,听说搜索引擎会跟进frame中的框架页面,也不知道会不会跟进iframe的页面,把那两个动态的jsp页面的url写进了robots.txt中禁止搜索引擎抓取这些没有实际意义的东西。像下面:


User-agent: *

Disallow: /common/userState.jsp

Disallow: /common/guestReply.jsp

Disallow: /count.do

本站完整的robots.txt见:http://java.learndiary.com/robots.txt

里面主要禁止搜索引擎访问一些个人才会用的功能,我是第一次写robots.txt,哪位朋友看了发现有问题请一定给我提示一下,谢谢。

浏览了一下《JAVA游戏编程》

前两天,我到新华书店浏览了一本Java游戏编程,一直想把其中的所得记下来。不过直到今天才动手。

这本书是外国人写的。主要是以Java为载体,谈游戏编程的基本技术。

如:多线程、人工智能、碰撞、B树什么的,还有贴图,纹理,等等。这些都是游戏编程一些比较基本的东西。除了这些技术性的内容,还讲了怎样用你的游戏挣钱:或者自己把它包装成一个产品,销售给大家,又提到了销售反馈;或者作为一个找一份好工作的资本:)

从我感觉,这本书把多线程放在了开头,说明多线程在游戏编程中是很重要的。

另外,这本书还让我知道了一些J2se1.5(J2se5.0)的特性。

如:

模板,在一个List中可以控制放入的对象;

改进的for循环,主要用于类似set的容器类中;

枚举类型;

实际,现在J2se6.0都出来了。不过,我一直都还用的J2se1.4。

在这本书中,作者还对Java在游戏编程中未来需要改进的东西作了一些描述。

在我的感觉中,游戏设计是一门综合性的技术,是各种学科的东西都要用到的尖端产品。游戏设计应该是一项很有挑战性的工作,而且,能够把游戏编程做好的人都是“人中精英”吧。

说起来,我参加工作后,对编程感兴趣还是来自于一台学习机上的Gbasic,我在上面兴致勃勃的用程序画一些有各种参数改变的立方体,做一些小的游戏角色碰到子弹就消失的东西。很有成就感。于是,就自考计算机,学编程到现在,不过都是业余兴趣而已。

页面静态化和网站地图生成,下一步做什么。。。

完成页面静态化和网站地图生成模块的主体部分,思维有点乱,理一下下一步应该做什么。

1、页面静态化:

   1)、把登录信息和游客留言的表单、页面计数各写进一个单独的jsp文件,然后用javascript或jframe调用;

   2)、为了统一,菜单栏的登录用户能够看见的项目使游客也可看见,减少静态化后页面处理的复杂度;

   3)、在目标页面的订阅邮件和退订邮件的提示信息有问题,要修正;

   4)、当更新一篇帖子后(修改或发评论后),当前帖子的原来的上一条和下一条帖子、原来的首条帖子都需要重新生成静态文件,不然这几条帖子的上一条、下一条导航要出现问题;考虑生成的时机;

   5)、上一条、下一条导航是按默认的最近更新排列的,为了与原来的动态选择排列顺序,考虑是否这种上一条、下一条的导航也用一个单独的jsp文件执行,然后用javascript或iframe调用;

   6)、帖子列表是否也静态化,静态化了排序功能就没有了;

   7)、删除一篇帖子的评论后不能在当时按设想更新静态文件,所以采取了重新显示帖子的过程中重新生成静态文件,需要找出原因;

2、网站地图生成:

   1)、继续完成在提交帖子或更新时的网站地图更新,现在是手动全部一次更新; 

3、这两天做静态化都是在网上调试的,还是应该在本地调试好后才传上去为好,免得让来访的朋友看见莫名其妙的东西:)