“面向对象”是一个如今被人叫烂的词汇Q就像去qh们都喜欢把自q公司打上?com”的标记一栗其实有多少真正理解q个词汇呢,很难说。我喜欢q样来比Mh们对“对象”一词的滥用。“对象”就好比Zl常说的“酷”和“爽”,很多人ƈ不仔l考虑q两个词的差别,在很多情况下他们是通用的,“酷”和“爽”通常表达“心(j)情不错”的意思,你可以在你玩的高兴的时候,大声的叫嚷“太酷了(jin)Q太爽了(jin)”,q个时候两个词汇是通用的。但是你可以说“这个h很酷啊”,但是你不能说“这个h很爽啊”。h们对“对象”这个词汇的滥用发生在q里Q“面向对象”和“基于对象”就好比“酷”和“爽?q是两个不同的概念,但是Z通常这两个词汇混ؓ(f)一谈,一律用“面向对象”来表达。常见的错误可以在此列D一些:(x)
1Q有个h兴高采烈的和你说“我不喜?flash 4 的脚本语aQflash 5 版本?action script 采用?jin)新的面向对象的?”语法,写v来很舒服。我现在一直用 flash 5 来做东西。”(同样的话语也发生?director ?lingo 脚本语言中)(j)
2Qvisual basic 采用?jin)面向对象的属性和Ҏ(gu)Q比赯ȝ basic 语言有了(jin)很大的提高?
3Qjavascript 是面向对象的?
{等?
通常听到cM的话Q你都要认真审视说话之hQ分析他说的话。可以肯定一点,他ƈ非真正懂得什么是面向对象的思想。很多h没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点Q封装,l承Q多态)(j)却一不可Q通常“基于对象”用对象,但是无法利用现有的对象模板生新的对象类型,l而生新的对象,也就是说“基于对象”没有承的特点Q而“多态”是表示为父cȝ型的子类对象实例Q没有了(jin)l承的概念也无从谈论“多态”。现在的很多行技术都是基于对象的Q它们用一些封装好的对象,调用对象的方法,讄对象的属性。但是它们无法让E序员派生新对象cd。他们只能用现有对象的Ҏ(gu)和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现?jin)“封装”的概念Q但是面向对象实C(jin)“承和多态”,而“基于对象”没有实现这些,的确很饶口?/P>
二、java ?C++ 在诏彻面向对象的思想斚w更加d?
我最q上的学?fn)班的老师Ҏ(gu)_(d)(x)“C++ 是打着面向对象的幌子,q着q程~程的勾当”,q句话我非常的赞同,而且我一直以来也是这么认为的。但是仔l听他讲解后Q我才发玎ͼ我是只是理解?jin)这句话前两层的意思。但是还有一层意思我没有理解。你可能要问Q“难?C++ 不是面向对象的吗Q”。事实上 C++ 是真正的面向对象~程语言。但是它也是q程~程语言。ؓ(f)什么怎么说呢Q?C++ 的生不但考虑?jin)面向对象的?gu),而且也更多的考虑?jin)?C 语言的向后兼容,使得 C++ q种杂合语言表现出“过E”和“对象”编E的双重性。你通常既可以l用 C++ ~译器来~写传统?C E序Q也可以使用 C ++ 的类库或者编写自qcL作面向对象编E。这U“两面性”得h们可以l保留原有的 C 代码Q同时也ȝ?jin)面向对象思想的推qѝ?/P>
举个单的例子Q?4 q的时候,我开始学?C++ Q当时是学习(fn) turbo C++ 自己带的一个叫?turbo vision 的类库来做项目。我的同学也?turbo C++ Q但是他一点也没有学习(fn)q?C++ q个语言Q他只是?turbo c++ ~译器来重新~译他以前用 turbo c 写的E序Q然后他自豪的对我说Q“瞧Q我?c++ 做的东西”,好像意思是说“我?c++ 开发项目了(jin)”,在那?c ?pascal 高档Q?pascal ?foxbase 高档的年代里Q?C++ 的标{Ҏ(gu)个很"?的标志。我其实很清楚他的行为。这是“C++ 是打着面向对象的幌子,q着q程~程的勾当”的W一重意思,也就是说Q?C++ ~译器对 C E序的兼Ҏ(gu)造成?jin)最底层的“过E勾当”。在国内有很长一D|_(d)Z都是在用 C++ ~译器做 C ~程?我当时在惻I比v我那个同学,我才是真正懂得面向对象的人?我学?fn)?jin) C++ 语言Q我懂得装Q承和多态,我学?fn)?jin) turbo vision 的类库,我派生了(jin) turbo vision 的类库ƈ~写?jin)自qc,所以我是懂得面向对象的。从某种意义上说Q我q么x对的。但是从面向对象E序员的分类来说Q我又不完全懂得面向对象的思想。从事面向对象编E的人按照分工来_(d)可以分ؓ(f)“类库的创徏者”和“类库的使用者”,通常创徏cd的h才是真正懂得面向对象思想的hQ他们创建类库供l那些“客L(fng)序员”来使用Q他们从头开始制作类库,他们q行面向对象的分析,设计Q实现的全过E。当学习(fn)?C++ 后,我的W一个感觉是Q从头创Z个类库真是很ȝ(ch)的事情,通常?C q程~程很容易实现的功能Q你必须按照cȝ思想来从新徏立对象,但是一旦类库徏立好后,使用cd和派生类Q以?qing)维护代码都是非常舒服的事情。用类库的人ƈ不都是具备了(jin)面向对象思想的hQ通常知道如何l承和派生新对象可以用类库了(jin)Q然而我们的思维q没有真正的转过来,使用cd只是在Ş式上是面向对象,而实质上只是库函数的一U扩展。这是我理解的“C++ 是打着面向对象的幌子,q着q程~程的勾当”的W二重意思,实际上用 C++ ~程的hQ大部分不自己创建类Q而是使用cdQ这样就造成?jin)他们把cd作ؓ(f)一U高U的库函数库来理解,q没有真正理解面向对象的思想?/P>
C++ 的面向对象的思想推广很慢Q直?MFC ,OWL QVCL q样的类库出来以后,Z才渐渐的接受?jin)一些面向对象的思想。ؓ(f)什么这条面向对象的道\那么难走Q我的答案是“因?C++ l了(jin)我们W二条道路去走过E编E”,当然原因是ؓ(f)?jin)考虑兼容 C 语言Q然而正是由于有?jin)第二条老\才得得我们不?x)再去考虑新的面向对象~程思维方式?/P>
直到出现?Java Q才真正q来?jin)面向对象的曙光。Java 真正是革命性的东西吗?不是Q所有现有的 java 的思想都是l承自其他的语言和技术,没有什么革命的地方Q虚拟机的概忉|?20 q前?UCSD pascal 中就采用?jin),只是当时的机器速度太慢Q虚拟机仿真造成的性能降低对于当时的硬件来说是相当严重的。java 本n的很多东西也借鉴?C++ 语言Q连它的创始Z_(d)java ?"C++--" 也就是说 java 去除?C++ 的一些不太好的地斏V所以说 Java 本质上没有什么革命的东西Q所以那些对 Java 的赞之词都?Sun 公司的宣传伎俩。没有一U语a?x)长久的存在下去Q你很难说你的孩子在二十q后q(sh)(x)l箋使用 C++ ?javaQ所以我们要抛开q些华词汇的背后,扑֯真正我们需要学?fn)的东西。否则今天我们大安是微软的傀(g)儡,明天 Sun 公司h?jin),我们都?Sun 的傀(g)儡。仔l研I美国电(sh)脑技术发展的历史Q美国h一向喜Ƣ象W三世界兜售他们的过时技术,而他们始l可以自豪的_(d)我们永q领先你们第三世界国家二十年。我们始l在跟在国人的后面学习(fn)他们的东西,q的让人担忧。我说着说着又跑题(sh)(jin)。Java 虽然没有什么真正的革命性的东西Q但?Java 在真正推动面向对象编E思想斚w是功不可末的。?Java ~程Q你无需考虑到向后兼容什么语a的问题,它是重新建立的语aQ你在掌握这门语a之前Q你必须自q~程思想pE编E彻底{向面向对象编E,因ؓ(f) 每个 Java E序Q本w就是一个类Q你~写M java E序Q你都不自觉的在构造一个对象模板,没有W二条道路,只能是面向对象编E。( 我非常喜?java 所有类定义和类声明攑֜一个文件中Q而不是象 C++ 那样Qcpp ?.h 文g是分开的。通常刚刚开始学?java 的h不习(fn)惯,不过学习(fn)一D|_(d)你就?x)体会(x)到它的好处了(jin)。)(j)Q?使用 java ~写E序Q我更喜Ƣ说---~写c,而不是程序)(j)的时候,你会(x)必须从一个对象的角度来考虑问题Q因Z的程序就是一个类Q你必须考虑把哪些东西作为成员变量,哪些作ؓ(f)Ҏ(gu)Q要生成几个c,哪些变量是成员变量,哪些是静(rn)态的变量和方法,{等。通常做完一个项目,你就已经面向对象的思想q用其中?jin)。之所以说 Java 在面向对象的贯彻斚w要比 C++ dQ就是因Z只能使用面向对象的方式来~写 java E序Q?C++ 却可以采用另外一条非面向对象的方式来~写E序。Java q没有什么真正革命性的东西Q它最大的贡献当然是推qK向对象的思想?jin)?/P>
Java ȝ来说是降低了(jin)l箋q程~程的可能性,但是q没有完全消除它。面向对象是一U思想Q是我们考虑事情的方法,通常表现Zؓ(f)我们是将问题的解x照过E方式来解决呢,q是问题抽象ؓ(f)一个对象来解决它。很多情况下Q我们会(x)不知不觉的按照过E方式来解决它,因ؓ(f)我们通常?fn)惯于考虑解决问题的方法,而不是考虑要解决问题抽象为对象去解决它。很多新的技术我们更加向于过E而非对象的思想。最明显的就?RAD (快速应用程序开发)(j)可视技术的出现Qh们可以通过讄属性和~写事g函数来快速开发应用程序,~写事g函数是典型的按照过E编E的思想Q至我是这么认为的Q,试问有多h能区分VB ?delphi ,c++ builder Qjava 的事件函数编写有什么本质的区别Q?后三者都采用?Delegation Q委托模型)(j)Q在 java 中是通过 anonymous c(无名c)(j)Q或?Adapter cL实现DelegationQ这是一U面向对象的构想Q但?VB 不是Q所以这底层的区别都被上层的怼性所Ҏ(gu)?jin),使?jbuilder ~程的时候,我们如果没有仔细研究 java ?awt.event ~程方式的话Q通常也是把它当作普普通通的“类 VB"的编写方式来写程序,而实际分析它在后台所生成的代码,你才能明白这些代码是真正的面向对象的Q但是如果你只是单的把它当作可视~程工具Q你是永q不?x)明白什么是”委托模型“,什么是面向对象~程的。这是我理解?“C++ 是打着面向对象的幌子,q着q程~程的勾当”第三重意思。无论是 C++ q是 java 都有可能走过E编E的老\Q?java 降低的过E编写的可能性,但是如果你没有具备面向对象的~程思想Q你q是可能走面向过E的老\的?/P>
xuesenlin http://www.jdon.com Oct 27, 2004 11:05 PM 回复
最q这个段旉都是忙于学习(fn) SpringFrameworkQ那东东好样的,只是刚刚学完StrutsQHibernateQ有来了(jin)q个Q呵呵,Q感觉挺累的?BR>“你怎么把这两个不相q的东西撤到一P?Q确实是q样Q?无论从他们的设计Q?BR>实现Q用等斚w他们是风马牛不相?qing)?但本Z理解的方面看他们有点cM。况且学?fn)要从对比中学呀Q这对初学者会(x)有帮助于理解?BR>重要声明Q本人都是用自己的语a写的Q有专业术语不对q请大家指出? - ) ZT?
p设计模式 [b]Decorator[/b],也就是装饰模式,q还?sh)好理解Q?在原有的东西上进行装C下便是装C(jin)。既然是装饰Q你要有M呀Q被修饰的东西)(j)Q还要有装饰品。但是不你装饰来装饰去Q他的本质是不变的?p人带上了(jin)面具Q但他还是h。墙上打上了(jin)Ҏ(gu)Q但它还是墙呀。你也许觉得q是废话?但理解这点很重要(q是跟策略模式Strategy的区?Q本得这个是理解?Decorator 模式很重要的一炏V在开发中你经常要增强一个类的功能,或者是撤销一个类的某些功能,但是一个类l众多的功能q行装饰?jin)以后,也许原来的类已经面目全非了(jin),你往往?x)感到茫(dng)其实Q你主要抓住他的MQ脑子里面时刻要知道你现在所作的工作是个主体进行打扮的工作?BR>研究qJive的都知道Q?里面?Filter 是用了(jin)Decorator 设计模式Q那么在q个设计里面Q它的主体是什么? ForumMessage Q无疑是 ForumMessage 。装饰品当然是Filter ?jin),所以我们在作这件事情的时候始l是以ForumMessage为核?j)的QFilter q行装饰的时候,你千万不要忘C现在是ؓ(f)ForumMessage而工作!有关于jive研究的文章,|上一大堆Q现在看看一个比较简单的 Decorator:
//比如有一个抽象构Ӟ(x)
public interface Component {
void operation();
}
//一个具体构Ӟ(x)
public class ConcreteComponent implements Component {
public void operation() {
//Write your code here
}
}
//一个抽象装饎ͼ(x)
public class Decorator implements Component {
private Component component; //引用
?? ? ?BR>//商业Ҏ(gu)Q委z构g
public void operation() {
component.operation();
}
}
//一个具体装饎ͼ(x)
public class ConcreteDecorator extends Decorator {
/**
* 商业Ҏ(gu)
*/
public void operation(){
//一些具体的装饰的代?/FONT>
......
super.operation(); // M
//一些具体的装饰的代?/FONT>
.......
}
}
......
我们主要看看Q在ConcreteDecorator 中的operation() Ҏ(gu)Q他的父cL委托到componentl徏来完成的Q其实它?yu)是MQ?一些装C码都?x)在q个Ҏ(gu)Q主体)(j)执行前进行“预处理”或是执行后q行“收䏀?BR>可不是,从上面很Ҏ(gu)qZ(jin)Q抽象装C的operation() Ҏ(gu)没有在具体的装饰cMq行“全盘”覆盖,因ؓ(f)他用?jin)super.operation(); q样的语句。可见装饰模式中不管怎么P 你都要找到类D个的Ҏ(gu)。说明他的主体还在?q是跟策略模式Strategy的区?
说了(jin)怎么多,不知道大家有没有感觉到ConcreteDecoratorcM的operation()Ҏ(gu)跟Spring AOP 中的 InvocationHandler 接口的invoke()Ҏ(gu)有点相类是呢Q?BR>我们来看看要实现 InvocationHandler 时候要重写的invoke()Ҏ(gu)Q?BR>
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
…………………?
result = method.invoke(originalObject, args);
…………………………?.
return result;
}
InvocationHandler.invoke Ҏ(gu)在被代理类的方法被调用之前触发。通过q个Ҏ(gu)中,我们可以在被代理cL法调用的前后q行一些处理,如上面代码中所C,InvocationHandler.invokeҎ(gu)的参C传递了(jin)当前被调用的Ҏ(gu)QMethodQ,以及(qing)被调用方法的参数。同Ӟ我们可以通过Method.invokeҎ(gu)调用被代理类的原始方法实现。这P我们可以在被代理类的方法调用前后大做文章。(说明Q引用了(jin)Spring 开发指南中的一D)(j)
在回到装饰模式,其方法operation() 在执行前和执行后Q也可以对它大做文章。如此看来, Spring AOP ?DecoratorQ从理解层面上来看,实有点相象Q注意:(x)只是理解层面Q?而他们的实现完全两马事!
其实主要是大家怎么看待q个问题Q按照本人的理解QSpring AOP 也可以说是一U广义的装饰Q但它又不是装饰模式。它同样也是Ҏ(gu)个方法加上了(jin)限制Q比如insert() 的时候,你要对它做执行前开启事务和执行后提交或回滚q样的“装饰”?又比如你也可以对某个人操作资源后做logq样的装饰工作。等{,Q?BR>他们的相同之处就q么炏V?BR>AOP 也不是什么新的东西,当然如果你的AOP是容?Jboss 4.0)实现的话Q?那么按照上面说的Q你的一些方法就?x)被容器所“装饰”?
如此看来Q更多的时候可以理解ؓ(f) Spring AOP 和一些AOP 容器是在pȝU的Q容器的“装饰”?而装饰模式则是业务的装饰?q点其实从客L(fng)也很Ҏ(gu)理解?BR>如果是AOP Q程序员可以攑ֿ(j)的写你的代码Q即使有点笨也不怕,有AOP护着呢)(j)?因ؓ(f)pȝ在pȝq行时候对q段代码q行“装饰”。也是_(d)q些装饰不会(x)出现在客L(fng)的代码中Q,Q而,Decorator模式呢?呵呵Q这个时候程序员要有点头脑了(jin)Q他们要自己l装一些装饰类Q按照某一U机制对Mq行装饰。也是_(d)q些修饰c要出现在客L(fng)的代码中。看代码q道了(jin) :--)
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(input)Q?BR>....//M是System.in
?Q?够经典的例子Q?
http://www.jdon.com/jive/article.jsp?forum=91&thread=17341
]]>