﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Vikings-文章分类-面向对象OO</title><link>http://www.blogjava.net/vikings/category/1405.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:38:04 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:38:04 GMT</pubDate><ttl>60</ttl><item><title>莫探员 -  我的面向对象程序观</title><link>http://www.blogjava.net/Vikings/articles/5065.html</link><dc:creator>Vikings</dc:creator><author>Vikings</author><pubDate>Sun, 22 May 2005 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/Vikings/articles/5065.html</guid><wfw:comment>http://www.blogjava.net/Vikings/comments/5065.html</wfw:comment><comments>http://www.blogjava.net/Vikings/articles/5065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vikings/comments/commentRss/5065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vikings/services/trackbacks/5065.html</trackback:ping><description><![CDATA[<SPAN class=oblog_text><STRONG>出处比较难找了。<BR>很早的时候看的一篇.<BR>google一下也很多<BR><BR>一、面向对象概念的一些误解</STRONG> 
<P>　　“面向对象”是一个如今被人叫烂的词汇，就像去年人们都喜欢把自己的公司打上“.com”的标记一样。其实有多少人能真正理解这个词汇呢，很难说。我喜欢这样来比喻人们对“对象”一词的滥用。“对象”就好比人们经常说的“酷”和“爽”，很多人并不仔细考虑这两个词的差别，在很多情况下他们是通用的，“酷”和“爽”通常表达“心情不错”的意思，你可以在你玩的高兴的时候，大声的叫嚷“太酷了，太爽了”，这个时候两个词汇是通用的。但是你可以说“这个人很酷啊”，但是你不能说“这个人很爽啊”。人们对“对象”这个词汇的滥用就发生在这里，“面向对象”和“基于对象”就好比“酷”和“爽”,这是两个不同的概念，但是人们通常将这两个词汇混为一谈，一律用“面向对象”来表达。常见的错误可以在此列举一些： </P>
<P>　　1）有个人兴高采烈的和你说“我不喜欢 flash 4 的脚本语言，flash 5 版本的 action script 采用了新的面向对象的“.”语法，写起来很舒服。我现在一直用 flash 5 来做东西。”（同样的话语也发生在 director 的 lingo 脚本语言中） </P>
<P>　　2）visual basic 采用了面向对象的属性和方法，比起过去的 basic 语言有了很大的提高。 </P>
<P>　　3）javascript 是面向对象的。 </P>
<P>　　等等。 </P>
<P>　　通常听到类似的话，你都要认真审视说话之人，分析他说的话。可以肯定一点，他并非真正懂得什么是面向对象的思想。很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点（封装，继承，多态）却一不可，通常“基于对象”使用对象，但是无法利用现有的对象模板产生新的对象类型，继而产生新的对象，也就是说“基于对象”没有继承的特点，而“多态”是表示为父类类型的子类对象实例，没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的，它们使用一些封装好的对象，调用对象的方法，设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候，通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念，但是面向对象实现了“继承和多态”，而“基于对象”没有实现这些，的确很饶口。</P>
<P>　　<STRONG>二、java 比 C++ 在贯彻面向对象的思想方面更加彻底。 </STRONG></P>
<P>　　我最近上的学习班的老师对我说：“C++ 是打着面向对象的幌子，干着过程编程的勾当”，这句话我非常的赞同，而且我一直以来也是这么认为的。但是仔细听他讲解后，我才发现，我是只是理解了这句话前两层的意思。但是还有一层意思我没有理解。你可能要问，“难道 C++ 不是面向对象的吗？”。事实上 C++ 是真正的面向对象编程语言。但是它也是过程编程语言。为什么怎么说呢， C++ 的产生不但考虑了面向对象的特性，而且也更多的考虑了对 C 语言的向后兼容，使得 C++ 这种杂合语言表现出“过程”和“对象”编程的双重性。你通常既可以继续用 C++ 编译器来编写传统的 C 程序，也可以使用 C ++ 的类库或者编写自己的类来作面向对象编程。这种“两面性”使得人们可以继续保留原有的 C 代码，同时也阻碍了面向对象思想的推广。</P>
<P>　　举个简单的例子，94 年的时候，我开始学习 C++ ，当时是学习 turbo C++ 自己带的一个叫作 turbo vision 的类库来做项目。我的同学也用 turbo C++ ，但是他一点也没有学习过 C++ 这个语言，他只是用 turbo c++ 编译器来重新编译他以前用 turbo c 写的程序，然后他自豪的对我说：“瞧，我用 c++ 做的东西”，好像意思是说“我用 c++ 开发项目了”，在那个 c 比 pascal 高档， pascal 比 foxbase 高档的年代里， C++ 的标签绝对是个很"酷"的标志。我其实很清楚他的行为。这就是“C++ 是打着面向对象的幌子，干着过程编程的勾当”的第一重意思，也就是说， C++ 编译器对 C 程序的兼容性造成了最底层的“过程勾当”。在国内有很长一段时间，人们都是在用 C++ 编译器做 C 编程。 我当时在想，比起我那个同学，我才是真正懂得面向对象的人。 我学习了 C++ 语言，我懂得封装，继承和多态，我学习了 turbo vision 的类库，我派生了 turbo vision 的类库并编写了自己的类，所以我是懂得面向对象的。从某种意义上说，我这么想是对的。但是从面向对象程序员的分类来说，我又不完全懂得面向对象的思想。从事面向对象编程的人按照分工来说，可以分为“类库的创建者”和“类库的使用者”，通常创建类库的人才是真正懂得面向对象思想的人，他们创建类库供给那些“客户程序员”来使用，他们从头开始制作类库，他们进行面向对象的分析，设计，实现的全过程。当学习完 C++ 后，我的第一个感觉是，从头创建一个类库真是很麻烦的事情，通常用 C 过程编程很容易实现的功能，你必须按照类的思想来从新建立对象，但是一旦类库建立好后，使用类库和派生类，以及维护代码都是非常舒服的事情。使用类库的人并不都是具备了面向对象思想的人，通常知道如何继承和派生新对象就可以使用类库了，然而我们的思维并没有真正的转过来，使用类库只是在形式上是面向对象，而实质上只是库函数的一种扩展。这就是我理解的“C++ 是打着面向对象的幌子，干着过程编程的勾当”的第二重意思，实际上用 C++ 编程的人，大部分不自己创建类，而是使用类库，这样就造成了他们把类库作为一种高级的库函数库来理解，并没有真正理解面向对象的思想。</P>
<P>　　C++ 的面向对象的思想推广很慢，直到 MFC ,OWL ，VCL 这样的类库出来以后，人们才渐渐的接受了一些面向对象的思想。为什么这条面向对象的道路那么难走？我的答案是“因为 C++ 给了我们第二条道路去走过程编程”，当然原因是为了考虑兼容 C 语言，然而正是由于有了第二条老路才使得使得我们不会再去考虑新的面向对象编程思维方式。</P>
<P>　　直到出现了 Java ，才真正迎来了面向对象的曙光。Java 真正是革命性的东西吗？不是，所有现有的 java 的思想都是继承自其他的语言和技术，没有什么革命的地方，虚拟机的概念早在 20 年前的 UCSD pascal 中就采用了，只是当时的机器速度太慢，虚拟机仿真造成的性能降低对于当时的硬件来说是相当严重的。java 本身的很多东西也借鉴了 C++ 语言，连它的创始人也说，java 是 "C++--" 也就是说 java 去除了 C++ 的一些不太好的地方。所以说 Java 本质上没有什么革命的东西，所以那些对 Java 的赞美之词都是 Sun 公司的宣传伎俩。没有一种语言会长久的存在下去，你很难说你的孩子在二十年后还会继续使用 C++ 或 java，所以我们要抛开这些浮华词汇的背后，找寻真正我们需要学习的东西。否则今天我们大家都是微软的傀儡，明天 Sun 公司起来了，我们就都是 Sun 的傀儡。仔细研究美国电脑技术发展的历史，美国人一向喜欢象第三世界兜售他们的过时技术，而他们始终可以自豪的说，我们将永远领先你们第三世界国家二十年。我们始终在跟在美国人的后面学习他们的东西，这的确让人担忧。我说着说着又跑题了。Java 虽然没有什么真正的革命性的东西，但是 Java 在真正推动面向对象编程思想方面是功不可末的。使用 Java 编程，你无需考虑到向后兼容什么语言的问题，它是重新建立的语言，你在掌握这门语言之前，你必须将自己的编程思想由过程编程彻底转向面向对象编程，因为 每个 Java 程序，本身就是一个类，你编写任何 java 程序，你都不自觉的在构造一个对象模板，没有第二条道路，只能是面向对象编程。（ 我非常喜欢 java 将所有类定义和类声明放在一个文件中，而不是象 C++ 那样，cpp 和 .h 文件是分开的。通常刚刚开始学习 java 的人不习惯，不过学习一段时间，你就会体会到它的好处了。）， 使用 java 编写程序（我更喜欢说---编写类，而不是程序）的时候，你会必须从一个对象的角度来考虑问题，因为你的程序就是一个类，你必须考虑把哪些东西作为成员变量，哪些作为方法，要生成几个类，哪些变量是成员变量，哪些是静态的变量和方法，等等。通常做完一个项目，你就已经将面向对象的思想运用其中了。之所以说 Java 在面向对象的贯彻方面要比 C++ 彻底，就是因为你只能使用面向对象的方式来编写 java 程序，而 C++ 却可以采用另外一条非面向对象的方式来编写程序。Java 并没有什么真正革命性的东西，它最大的贡献当然是推广面向对象的思想了。</P>
<P>　　Java 总的来说是降低了继续过程编程的可能性，但是并没有完全消除它。面向对象是一种思想，是我们考虑事情的方法，通常表现为为我们是将问题的解决按照过程方式来解决呢，还是将问题抽象为一个对象来解决它。很多情况下，我们会不知不觉的按照过程方式来解决它，因为我们通常习惯于考虑解决问题的方法，而不是考虑将要解决问题抽象为对象去解决它。很多新的技术使我们更加趋向于过程而非对象的思想。最明显的就是 RAD (快速应用程序开发）可视技术的出现，人们可以通过设置属性和编写事件函数来快速开发应用程序，编写事件函数就是典型的按照过程编程的思想（至少我是这么认为的），试问有多少人能区分VB 和 delphi ,c++ builder ，java 的事件函数编写有什么本质的区别， 后三者都采用了 Delegation （委托模型），在 java 中是通过 anonymous 类（无名类），或者 Adapter 类来实现Delegation，这是一种面向对象的构想，但是 VB 不是，所以这底层的区别都被上层的相似性所抹杀了，使用 jbuilder 编程的时候，我们如果没有仔细研究 java 的 awt.event 编程方式的话，通常也是把它当作普普通通的“类 VB"的编写方式来写程序，而实际分析它在后台所生成的代码，你才能明白这些代码是真正的面向对象的，但是如果你只是简单的把它当作可视编程工具，你是永远不会明白什么是”委托模型“，什么是面向对象编程的。这是我理解的 “C++ 是打着面向对象的幌子，干着过程编程的勾当”第三重意思。无论是 C++ 还是 java 都有可能走过程编程的老路， java 降低的过程编写的可能性，但是如果你没有具备面向对象的编程思想，你还是可能走面向过程的老路的。</P></SPAN><img src ="http://www.blogjava.net/Vikings/aggbug/5065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vikings/" target="_blank">Vikings</a> 2005-05-22 21:14 <a href="http://www.blogjava.net/Vikings/articles/5065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>心得：Spring AOP和Decorator模式</title><link>http://www.blogjava.net/Vikings/articles/4816.html</link><dc:creator>Vikings</dc:creator><author>Vikings</author><pubDate>Wed, 18 May 2005 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/Vikings/articles/4816.html</guid><wfw:comment>http://www.blogjava.net/Vikings/comments/4816.html</wfw:comment><comments>http://www.blogjava.net/Vikings/articles/4816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vikings/comments/commentRss/4816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vikings/services/trackbacks/4816.html</trackback:ping><description><![CDATA[<H3 align=center>心得：Spring AOP和Decorator模式</H3>
<P align=center><A title=xuesenlin href="http://www.jdon.com/jive/profile.jsp?user=11119"><B>xuesenlin</B></A> http://www.jdon.com Oct 27, 2004 11:05 PM <A href="http://www.jdon.com/jive/post.jsp?forum=91&amp;thread=17341&amp;message=8668553&amp;reply=true"><IMG height=17 alt=回复此消息 hspace=3 src="http://www.jdon.com/jive/images/reply.gif" width=17 border=0></A> <FONT size=+0><A title=回复此消息 href="http://www.jdon.com/jive/post.jsp?forum=91&amp;thread=17341&amp;message=8668553&amp;reply=true">回复</A> </FONT></P>
<P>最近这个段时间都是忙于学习 SpringFramework，那东东好样的，只是刚刚学完Struts，Hibernate，有来了这个，呵呵，，感觉挺累的。<BR>“你怎么把这两个不相干的东西撤到一起？” ，确实是这样！ 无论从他们的设计，<BR>实现，使用等方面他们是风马牛不相及， 但本人认为从理解的方面看他们有点类似。况且学习要从对比中学呀！这对初学者会有帮助于理解。<BR>重要声明：本人都是用自己的语言写的，有专业术语不对还请大家指出。: - ) <BR>就说设计模式 [b]Decorator[/b],也就是装饰模式，这还不好理解？ 在原有的东西上进行装饰一下便是装饰了。既然是装饰，你要有主体呀（被修饰的东西），还要有装饰品。但是不管你装饰来装饰去，他的本质是不变的。 就象人带上了面具，但他还是人。墙上打上了油漆，但它还是墙呀。你也许觉得这是废话。 但理解这点很重要(这是跟策略模式Strategy的区别)，本人觉得这个是理解好 Decorator 模式很重要的一点。在开发中你经常要增强一个类的功能，或者是撤销一个类的某些功能，但是一个类给众多的功能进行装饰了以后，也许原来的类已经面目全非了，你往往会感到茫然，其实，你主要抓住他的主体，脑子里面时刻要知道你现在所作的工作就是为这个主体进行打扮的工作。<BR>研究过Jive的都知道， 里面的 Filter 就是用了Decorator 设计模式，那么在这个设计里面，它的主体是什么？ ForumMessage ，无疑是 ForumMessage 。装饰品当然是Filter 了，所以我们在作这件事情的时候始终是以ForumMessage为核心的，Filter 进行装饰的时候，你千万不要忘记你现在是为ForumMessage而工作！有关于jive研究的文章，网上一大堆，现在看看一个比较简单的 Decorator:<BR><BR><BR><BR></FONT><FONT color=#0000aa>//比如有一个抽象构件：</FONT><FONT color=black><BR><B>public</B> <B>interface</B> Component {<BR><B>void</B> operation();<BR>}<BR></FONT><FONT color=#0000aa>//一个具体构件：</FONT><FONT color=black><BR><B>public</B> <B>class</B> ConcreteComponent implements Component {<BR><B>public</B> <B>void</B> operation() {<BR></FONT><FONT color=#0000aa>//Write your code here</FONT><FONT color=black><BR>}<BR>}<BR></FONT><FONT color=#0000aa>//一个抽象装饰：</FONT><FONT color=black><BR><B>public</B> <B>class</B> Decorator implements Component {<BR><B>private</B> Component component; </FONT><FONT color=#0000aa>//引用</FONT><FONT color=black><BR>… …. …. …<BR></FONT><FONT color=#0000aa>//商业方法，委派给构件</FONT><FONT color=black><BR><B>public</B> <B>void</B> operation() {<BR>component.operation();<BR>}<BR>}<BR></FONT><FONT color=#0000aa>//一个具体装饰：</FONT><FONT color=black><BR><B>public</B> <B>class</B> ConcreteDecorator <B>extends</B> Decorator {<BR></FONT><FONT color=#0000aa>/**<BR>* 商业方法<BR>*/</FONT><FONT color=black><BR><B>public</B> <B>void</B> operation(){<BR></FONT><FONT color=#0000aa>//一些具体的装饰的代码</FONT><FONT color=black><BR>......<BR><B>super</B>.operation(); </FONT><FONT color=#0000aa>// 主体</FONT><FONT color=black><BR></FONT><FONT color=#0000aa>//一些具体的装饰的代码</FONT><FONT color=black><BR>.......<BR>}<BR>}<BR><PRE></PRE><BR>......<BR>我们主要看看，在ConcreteDecorator 中的operation() 方法，他的父类是委托到component组建来完成的，其实它就是主体， 一些装饰代码都会在这个方法（主体）执行前进行“预处理”或是执行后进行“收尾”。<BR>可不是，从上面很容易就看出了，抽象装饰中的operation() 方法没有在具体的装饰类中进行“全盘”覆盖，因为他用了super.operation(); 这样的语句。可见装饰模式中不管怎么样， 你都要找到类似这个的方法。说明他的主体还在。(这是跟策略模式Strategy的区别)<BR>说了怎么多，不知道大家有没有感觉到ConcreteDecorator类中的operation()方法跟Spring AOP 中的 InvocationHandler 接口的invoke()方法有点相类是呢？<BR>我们来看看要实现 InvocationHandler 时候要重写的invoke()方法：<BR><BR><BR><BR><B>public</B> Object invoke(Object proxy, Method method, Object[] args)<BR>throws Throwable {<BR>…………………….<BR>result = method.invoke(originalObject, args);<BR>……………………………..<BR><B>return</B> result;<BR>}<BR><PRE></PRE><BR><BR>InvocationHandler.invoke 方法将在被代理类的方法被调用之前触发。通过这个方法中，我们可以在被代理类方法调用的前后进行一些处理，如上面代码中所示，InvocationHandler.invoke方法的参数中传递了当前被调用的方法（Method），以及被调用方法的参数。同时，我们可以通过Method.invoke方法调用被代理类的原始方法实现。这样，我们就可以在被代理类的方法调用前后大做文章。（说明：引用了Spring 开发指南中的一段）<BR>在回到装饰模式，其方法operation() 在执行前和执行后，也可以对它大做文章。如此看来， Spring AOP 和 Decorator，从理解层面上来看，确实有点相象，注意：只是理解层面， 而他们的实现完全两马事！<BR>其实主要是大家怎么看待这个问题，按照本人的理解，Spring AOP 也可以说是一种广义的装饰，但它又不是装饰模式。它同样也是对某个方法加上了限制，比如insert() 的时候，你要对它做执行前开启事务和执行后提交或回滚这样的“装饰”。 又比如你也可以对某个人操作资源后做log这样的装饰工作。等等，，<BR>他们的相同之处就这么点。<BR>AOP 也不是什么新的东西，当然如果你的AOP是容器(Jboss 4.0)实现的话， 那么按照上面说的，你的一些方法就会被容器所“装饰”。 <BR>如此看来，更多的时候可以理解为 Spring AOP 和一些AOP 容器是在系统级的，容器级的“装饰”。 而装饰模式则是业务级的装饰。 这点其实从客户端也很容易理解。<BR>如果是AOP ，程序员可以放心的写你的代码（即使有点笨也不怕，有AOP护着呢）。 因为系统将在系统运行时候对这段代码进行“装饰”。也就是说，这些装饰不会出现在客户端的代码中，，，而，Decorator模式呢？呵呵，这个时候程序员要有点头脑了，他们要自己组装一些装饰类，按照某一种机制对主体进行装饰。也就是说，这些修饰类要出现在客户端的代码中。看代码就知道了 :--)<BR><BR><BR>InputStreamReader input = <B>new</B> InputStreamReader(System.in);<BR>BufferedReader br = <B>new</B> BufferedReader(input)；<BR>....</FONT><FONT color=#0000aa>//主体是System.in</FONT><FONT color=black><BR><PRE></PRE><BR>哦 ， 够经典的例子！ <BR>
<P>ZT自:<A href="http://www.jdon.com/jive/article.jsp?forum=91&amp;thread=17341"><BR>http://www.jdon.com/jive/article.jsp?forum=91&amp;thread=17341</A></P></FONT><img src ="http://www.blogjava.net/Vikings/aggbug/4816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vikings/" target="_blank">Vikings</a> 2005-05-18 23:49 <a href="http://www.blogjava.net/Vikings/articles/4816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>