📄 面向对象的思维方法-java面向对象 - it电子教育门户 高端java培训.htm
字号:
从计数器中取计数<BR>// 这里向客户浏览器输出<BR>...</FONT></P>
<P><FONT
face="Times New Roman">程序的框架全都写好了,剩下的就是实现Counter类方法里面具体的代码了,此时才去考虑具体的程序语言实现的细节,比如,在getCount()方法里面访问数据库,更新计数值。</FONT></P>
<P><FONT
face="Times New Roman">从上面的例子中看到,面向对象的思维方法其实就是我们在现实生活中习惯的思维方式,是从人类考虑问题的角度出发,把人类解决问题的思维方式逐步翻译成程序能够理解的思维方式的过程,在这个翻译的过程中,软件也就逐步被设计好了。</FONT></P>
<P><FONT
face="Times New Roman">在运用面向对象的思维方法进行软件设计的过程中,最容易犯的错误就是开始分析的时候,就想到了程序代码实现的细节,因此封装的类完全是基于程序实现逻辑,而不是基于解决问题的业务逻辑。</FONT></P>
<P><FONT
face="Times New Roman">学习JDBC编程的经典错误问法是:“我怎样封装对数据库的select操作?”</FONT></P>
<P><FONT
face="Times New Roman">面向对象的设计是基于解决业务问题的设计,而不是基于具体编程技术的设计。我不会去封装select语句的,我只封装解决问题的业务逻辑,对数据库的读取是在业务逻辑的编码实现阶段才去考虑的问题。</FONT></P>
<P><FONT
face="Times New Roman">回过头看上面那个发广告邮件的例子,应该如何应用面向对象的思维方法呢?</FONT></P>
<P><FONT
face="Times New Roman">对于一个邮件来说,有邮件头,邮件体,和邮件地址这三个属性,发送邮件,需要一个发送的方法,另外还需要一个能把所有邮件地址列出来的方法。所以应该如下设计:</FONT></P>
<P><FONT face="Times New Roman">类JunkMail</FONT></P>
<P><FONT
face="Times New Roman">属性:<BR>head<BR>body<BR>address<BR>方法:<BR>sendMail()
// 发送邮件<BR>listAllMail() // 列邮件地址</FONT></P>
<P><FONT face="Times New Roman">用Java来表示:</FONT></P>
<P><FONT face="Times New Roman">public class JunkMail
{<BR>private String head;<BR>private String body;<BR>private
String address;<BR>public JunkMain() { // 默认的类构造器<BR>//
从外部配置文件读邮件头和邮件体<BR>this.head=...;<BR>this.body=...;<BR>}</FONT></P>
<P><FONT face="Times New Roman">public static boolean
sendMail(String address) {<BR>//
调用qmail,发送email<BR>}</FONT></P>
<P><FONT face="Times New Roman">public static Collection
listAllMail() {<BR>// 访问数据库,返回一个邮件地址集合<BR>}<BR>}</FONT></P>
<P><FONT
face="Times New Roman">当把JunkMail设计好了以后,再调用JunkMail类完成邮件的发送,将是非常轻松的事情。</FONT></P>
<P><FONT
face="Times New Roman">如果说传统的面向过程的编程是符合机器运行指令的流程的话,那么面向对象的思维方法就是符合现实生活中人类解决问题的思维过程。</FONT></P>
<P><FONT
face="Times New Roman">在面向对象的软件分析和设计的时候,要提醒自己,不要一上来就去想程序代码的实现,应该抛开具体编程语言的束缚,集中精力分析我们要实现的软件的业务逻辑,分析软件的业务流程,思考应该如何去描述和实现软件的业务。毕竟软件只是一个载体,业务才是我们真正要实现的目标。</FONT></P>
<P><FONT
face="Times New Roman">但是在设计过程中,心里却往往在担心,如果我完全不去考虑程序代码的实现的话,那么我怎么知道我的设计一定合理呢?我怎么知道我设计的类、接口一定可以实现呢?所以经常可以看到的现象就是:</FONT></P>
<P><FONT
face="Times New Roman">在设计过程中,虽然知道不能过早考虑代码实现,但是每设计一个类,一个接口,心里都要不知不觉的用自己熟悉的编程语言大概的评估一下,看看能否编出来,因此,一不小心,就会又回到按照程序功能实现的思路进行设计的老路上去了。</FONT></P>
<P><FONT
face="Times New Roman">举个例子来说明,在做Web程序设计的时候,经常要遇到分页显示数据的情况。比如说需要把系统中所有的用户都列出来这样的功能。假设使用User类来表示用户,增加用户addUser(),删除用户deleteUser(),查询所有用户listUsers()方法。而数据库中有一个user表,一条记录是一个用户的信息。下面考虑一下User类的方法的实现:</FONT></P>
<P><FONT
face="Times New Roman">addUser()和deleteUser()方法都好实现,就是对数据库增加记录和删除记录。对于listUsers()方法,其实就是对user表的select,取出一个记录集。但是该怎么从listUsers()方法中得到所有用户的列表呢?</FONT></P>
<P><FONT
face="Times New Roman">一个方法调用的返回值只有一个,没有多个,所以很多情况下采用的办法就是返回值定义为集合类型,比如Vector。这样就可以在listUsers()方法的具体代码实现的时候,从数据库依次取出一个个记录,插入到Vector里面来。在主程序里面,调用listUsers()方法可以返回一个Vector,然后再对Vector遍历操作,就可以得到用户列表了。</FONT></P>
<P><FONT face="Times New Roman">public class User {</FONT></P>
<P><FONT face="Times New Roman">public static void
addUser(...) {<BR>// 数据库insert一条记录<BR>}</FONT></P>
<P><FONT face="Times New Roman">public static void
deleteUser(...) {<BR>// 数据库delete一条记录<BR>}</FONT></P>
<P><FONT face="Times New Roman">public Vector listUsers(...)
{<BR>// 数据库select结果放到一个集合里面<BR>}<BR>}</FONT></P>
<P><FONT
face="Times New Roman">这样的设计基本合理,但是仍然有点小问题。因为在设计的时候,就考虑到了用Java的集合类Vector来实现对不定长数据集的存放,因而违反了面向对象设计的一个原则:在设计的时候不应过早的考虑具体程序语言的实现。所以必须用抽象的方法,和具体实现无关的方法来表达业务逻辑。</FONT></P>
<P><FONT
face="Times New Roman">我们知道,通常对具有集合特征的数据结构进行遍历通常可以使用next和hasNext方法,next实现取下一个用户,hasNext判断是否还有元素。
因此我们定义一个接口Iterator,这个接口中定义两个方法next和hasNext:</FONT></P>
<P><FONT face="Times New Roman">public interface Iterator
{<BR>public boolean hasNext() {}<BR>public Object next()
{}<BR>}</FONT></P>
<P><FONT
face="Times New Roman">而User类的listUses方法返回值改为Iterator接口的实现类:</FONT></P>
<P><FONT face="Times New Roman">public class User
{<BR>...<BR>public Iterator listUsers()
{<BR>}<BR>...<BR>}</FONT></P>
<P><FONT
face="Times New Roman">这样就把User类的设计和具体的实现方法分离开了,因为此时任何实现了next()和hasNext()方法的类都可以做为listUsers的返回值,都可以被用来表达“用户列表”,而不仅仅可以使用Vector而已。比如,我可以用ArrayList来表达用户列表,因为ArrayList也实现了Iterator,当然我也可以自己专门写一个类来存放用户列表,只要实现next()和hasNext()方法就行了。</FONT></P>
<P><FONT
face="Times New Roman">这样在具体的编写代码的时候,程序员具有了最大的灵活性,可以根据具体的情况,采用不同的编程方法来存放用户列表。特别是降低了程序的耦合度,提高了程序的可移植性。对于上面那个JunkMail的listAllMail()方法也同样应该改为接口类型。</FONT></P>
<P><FONT
face="Times New Roman">然后,在主程序里面就这样来使用User类的listUsers方法:</FONT></P>
<P><FONT face="Times New Roman">User myUser = new
User();<BR>Iterator iterator = myUser.listUsers();<BR>while
(iterator.hasNext()) {<BR>iterator.next();<BR>}</FONT></P>
<P><FONT
face="Times New Roman">这样就可以完全不用考虑程序代码实现了,从高层次上把功能抽象出来,定义成为接口,同时又可以把系统设计的很合理,完全根据业务的需求来进行设计。</FONT></P></DIV></SPAN></TD></TR>
<TR>
<TD width="71%"> </TD>
<TD width="29%">【 <A
href="http://www.mldn.cn/print.jtml?articleid=2322">打印</A> 】【
<A
href="http://www.mldn.cn/member/favlist.jtml?action=add&postid=2322">收藏</A>
】【 <A href="http://www.mldn.cn/email.jtml?articleid=2322"
target=_blank>推荐</A> 】 </TD></TR>
<TR>
<TD colSpan=2>
<TABLE cellSpacing=3 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR height=25>
<TD align=middle width="33%"><IMG height=95 alt=java视频教程
src="面向对象的思维方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/javavideo.gif"
width=642></TD></TR>
<TR>
<TD class=content-table vAlign=top align=middle>
<TABLE>
<TBODY>
<TR>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-8-21/article_view_2251.htm"
rel=external><IMG class=midImg alt=struts2.0入门视频
src="面向对象的思维方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/struts2.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=struts2.0入门视频
href="http://www.mldn.cn/articleview/2007-8-21/article_view_2251.htm"
rel=external>struts2.0入门视频</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-6-15/article_view_2141.htm"
rel=external><IMG class=midImg
alt=JAVAEE学习流程和学习方法
src="面向对象的思维方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/j2eejc.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=JAVAEE学习流程和学习方法
href="http://www.mldn.cn/articleview/2007-6-15/article_view_2141.htm"
rel=external>JAVAEE学习流程和学习方..</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-6-5/article_view_2091.htm"
rel=external><IMG class=midImg
alt=1-Java介绍及JDK配置
src="面向对象的思维方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/javase.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=1-Java介绍及JDK配置
href="http://www.mldn.cn/articleview/2007-6-5/article_view_2091.htm"
rel=external>1-Java介绍及JDK配置..</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-4-19/article_view_2012.htm"
rel=external><IMG class=midImg alt=Oracle中的多表连接
src="面向对象的思维方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/Oracle.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=Oracle中的多表连接
href="http://www.mldn.cn/articleview/2007-4-19/article_view_2012.htm"
rel=external>Oracle中的多表连接</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-4-11/article_view_1978.htm"
rel=external><IMG class=midImg
alt=Struts中logic标签的使用
src="面向对象的思维方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/struts.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=Struts中logic标签的使用
href="http://www.mldn.cn/articleview/2007-4-11/article_view_1978.htm"
rel=external>Struts中logic标签..</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2>
<TABLE cellSpacing=3 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR height=25>
<TD align=middle width="33%" bgColor=#aac4c4><FONT
color=#ffffff>相关文章</FONT></TD>
<TD align=middle width="33%" bgColor=#aac4c4><FONT
color=#ffffff>推荐文章</FONT></TD></TR>
<TR>
<TD class=content-table vAlign=top>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-10-30/article_view_2601.htm"
rel=external>面向对象的逻辑思维方法</A></TD>
<TD style="TEXT-ALIGN: right"><SPAN
class=link-Date>[10.30]</SPAN></TD></TR>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-9-4/article_view_2286.htm"
rel=external>JAVA基础之面向对象</A></TD>
<TD style="TEXT-ALIGN: right"><SPAN
class=link-Date>[9.4]</SPAN></TD></TR>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-3-19/article_view_1739.htm"
rel=external>开始面向对象的编程</A></TD>
<TD style="TEXT-ALIGN: right"><SPAN
class=link-Date>[3.19]</SPAN></TD></TR>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-3-10/article_view_1653.htm"
rel=external>Java 入门之开始面向对象的编..</A></TD>
<TD style="TEXT-ALIGN: right"><SPAN
class=link-Date>[3.10]</SPAN></TD></TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -