键者天行

天行键,君子以自强不息;地势坤,君子以厚德载物!

用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
chensheng913的公告
<script type="text/javascript"><!-- google_ad_client = "pub-6803754109867180"; /* 728x90, 创建于 09-2-25 */ google_ad_slot = "4563147298"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <b>&nbsp;&nbsp; &nbsp;<A HREF="http://blog.csdn.net/chensheng913"><font color=red>首页</font></A></b>&nbsp;&nbsp;&nbsp;&nbsp; <script language="JavaScript" type="text/javascript" src="http://www.50bang.com/click.js?user_id=23505"></script> &nbsp&nbsp;&nbsp&nbsp;<b><A HREF="http://blog.csdn.net/chensheng913/archive/2004/10/23/148309.aspx"><font color=red>留言</font></A></b> <EMBED SRC=http://www.brwin.com/upload/clock/clock6.swf WIDTH=150 HEIGHT=150 wmode=transparent quality=high loop=true menu=false><br><font color=black>本站总访问量:</font> <center> <img src=http://nmc2.jy.js.cn/cgi-bin/counter.pl?id=chensheng913blog&md=a48&ln=8&from=0&bd=$0;$0;$255></center> <br> <font color=black>当前页访问量:</font> <center> <img src="" id="PageView"><br> <img src="" id="TotalView" style="display:none"><br> </center> <script> //设置两个计数计的外观样式,取值1-60 var PageCountStyle=48 var TotalCountStyle=48 try{ var sUrl=self.location.href var re=new RegExp("(.+\.net\/)([^\/]+)([^\.]*)","ig") if(re.test(sUrl)) { var blog_id=RegExp.$2; var page_id=blog_id+"__"+RegExp.$3.replace(/\//g,""); blog_id+="__CSDNBLOG" var cUrl="http://nmc2.jy.js.cn/cgi-bin/counter.pl?ln=8&bd=$0;$0;$255&from=1000" document.all.PageView.src=cUrl+"&id="+page_id+"&md=a"+PageCountStyle document.all.TotalView.src=cUrl+"&id="+blog_id+"&md=a"+TotalCountStyle } }catch(e){;} </script> 与我联系:<a href="mailto:chensheng913@yahoo.com.cn" target=_blank>我的EMAIL </a> <iframe width=0 height=0 frameborder=0 scrolling=NO src="about:blank"> </iframe> <font color=blue></font> <b></b><br> <!-- Blog日历表开始 --> <script language="javascript"> var diarydays="<2007-03-07><2007-03-02><2006-12-28><2006-10-31><2006-10-23><2006-10-17><2006-09-04><2006-08-29><2006-08-21><2006-08-14><2006-07-26><2006-07-14><2006-06-27><2006-05-31><2006-05-09><2006-04-28><2006-04-03><2006-03-23><2006-02-09><><2006-02-06><2006-02-05><2006-01-24><2006-01-23><2006-01-18><2006-01-17><2006-01-16><2006-01-13><2005-12-31><2005-12-29><2005-12-28><2005-12-26><2005-12-20><200-12-13><2005-12-10><2005-12-08><2005-12-07><2005-12-05><2005-11-24><2005-11-22><2005-11-10><2005-11-07><2005-11-03><2005-11-01><2005-10-27><2005-10-25><2005-10-21><2005-10-20><2005-10-19><2005-10-16><2005-10-13><2005-10-12><2005-10-11><2005-10-10><2005-10-09><2005-09-26><2005-09-25><2005-09-24><2005-09-22><2005-09-21><2005-09-20><2005-09-19><2005-09-16><2005-09-15><2005-09-14><2005-09-13><2005-09-12><2005-08-30><2005-08-29><2005-08-26><2005-08-25><2005-08-24><2005-08-23><2005-08-19><2005-08-17><2005-08-16><2005-08-12><2005-08-11><2005-08-10><2005-08-09><2005-08-08><2005-07-07><2005-07-04><2005-06-29><2005-06-28><2005-06-27><2005-06-24><2005-06-23><2005-06-21><2005-06-14><2005-06-13><2005-06-06><2005-06-05><2005-05-31><2005-05-26><2005-05-24><2005-05-23><2005-05-20><2005-05-17><2005-05-16><2005-05-13><2005-05-08><2005-04-29><2005-04-28><2005-04-26><2005-04-25><2005-04-23><2005-04-22><2005-04-21><2005-04-20><2005-04-19><2005-04-18><2005-04-15><2005-04-14><2005-04-13><2005-04-12><2005-04-11><2005-04-08><2005-04-05><2005-04-04><2005-04-02><2005-03-30><2005-03-29><2005-03-28><2005-03-27><2005-03-26><2005-03-24><2005-03-23><2005-03-22><2005-03-21><2005-03-18><2005-03-16><2005-03-15><2005-03-13><2005-03-12><2005-03-11><2005-03-10><2005-03-09><2005-03-08><2005-03-07><2005-03-05><2005-03-02><2005-03-01><2005-02-27><2005-02-26><2005-02-25><2005-02-22><2005-02-20><2005-02-19><2005-02-18><2005-02-17><2005-02-16><2005-02-06><2005-02-04><2005-02-02><2005-01-31><2005-01-29><2005-01-25><2005-01-24><2005-01-17><2005-01-13><2005-01-12><2005-01-10><2005-01-07><2005-01-04><2004-12-31><2004-12-29><2004-12-27><2004-12-26><2004-12-24><2004-12-22><2004-12-20><2004-12-19><2004-12-17><2004-12-16><2004-12-14><2004-12-08><2004-12-04><2004-12-03><2004-11-28><2004-11-27><2004-11-23><2004-11-20><2004-11-17><2004-11-12><2004-11-10><2004-11-08><2004-11-04><2004-11-02><2004-11-01><2004-10-31><2004-10-30><2004-10-29><2004-10-26><2004-10-23><2004-10-18><2004-10-16><2004-10-15><2004-10-14><2004-10-11><2004-09-07><2004-09-06><2004-09-05><2004-09-03><2004-09-02><2004-09-01><2004-08-31><2004-08-30><2004-08-29><2004-08-28><2004-08-27><2004-08-26><2004-08-25><2004-08-24><2004-08-23><2004-08-22><2004-08-21><2004-08-20><2004-08-19><2004-08-18><2004-08-17><2004-08-15><2004-08-13><2004-08-12><2004-08-11><2004-08-10><2004-08-09><2004-08-08><2004-08-06><2004-08-05><2004-08-04><2004-08-03><2004-08-02><2004-08-01><2004-07-31><2004-07-30><2004-07-29><2004-07-27><2004-07-26><2004-07-25><2004-07-22><2004-07-21><2004-07-20><2004-07-19><2004-07-18><2004-07-16><2004-07-15><2004-07-14><2004-07-13><2004-07-12><2004-07-11><2004-07-10><2004-07-09><2004-07-08><2004-07-06><2004-07-05><2004-07-04><2004-07-03><2004-07-02><2004-07-01><2004-06-30><2004-06-27><2004-06-26>"; </script> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style> .calendarBigBorder { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; text-decoration: none; width: 170; background-color: #FFFFFF; font-size: 9pt;border:1px dotted #999; } .calendarTd { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #000000; background-color: #eeeeee; height: 18px; width: 11%; text-align: center;} .calendarMInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; text-decoration: none; background-color: #FFFFFF; height: 15px; border: 1px solid #666666; width: 19px; color: #0099FF;} .calendarYInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #0099FF; text-decoration: none; background-color: #FFFFFF; height: 15px; width: 34px; border: 1px solid #666666;} .calendarMonthTitle { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; height: 24px; text-align: center; color: #333333; text-decoration: none; background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-bottom-style: none; border-top-color: #999999; border-right-color: #999999; border-bottom-color: #999999; border-left-color: #999999;} .calendarNow { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: bold; color: #000000; background-color: #C0C9D3; height: 18px; text-align: center;} .calendarDaySat { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarDaySun { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarLink { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; color: #333333; text-decoration: none; background-color: #E7E7F6; text-align: center; height: 18px;} .categoryTxt { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; line-height: 23px; color: #333333; text-decoration: none;} .categoryTable { border-right-width: 1px; border-bottom-width: 1px; border-right-style: solid; border-bottom-style: solid; border-left-style: none; border-right-color: #000000; border-bottom-color: #000000; border-top-width: 1px; border-top-style: solid; border-top-color: #71b99c;} </style> <SCRIPT LANGUAGE="JavaScript"> var months = new Array("一", "二", "三","四", "五", "六", "七", "八", "九","十", "十一", "十二"); var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31); var days = new Array("日","一", "二", "三","四", "五", "六"); var classTemp; var calendarHover="calendarHover"; var today=new getToday(); var year=today.year; var month=today.month; var newCal; //得到某月天数 function getDays(month, year) { if (1 == month) return ((0 == year % 4) && (0 != (year % 100))) ||(0 == year % 400) ? 29 : 28; else return daysInMonth[month]; } //得到当天时间信息 function getToday() { this.now = new Date(); this.year = this.now.getFullYear(); this.month = this.now.getMonth(); this.day = this.now.getDate(); } //生成日历 function Calendar() { newCal = new Date(year,month,1); //当前月的第一天 today = new getToday(); var day = -1; //用来判断日历中是否为当天 var startDay = newCal.getDay(); //当月开始时间 var endDay=getDays(newCal.getMonth(), newCal.getFullYear());//当月结束时间 var daily = 0; //用来生成日历中的天数值 if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth())) day = today.day; var caltable = document.all.caltable.tBodies.calendar; //得到日历表格的集合 var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear()); //得到当月天数 //生成日历 for (var intWeek = 0; intWeek < caltable.rows.length;intWeek++) for (var intDay = 0;intDay < caltable.rows[intWeek].cells.length;intDay++) { var cell = caltable.rows[intWeek].cells[intDay]; //得到单元袼 //生成字符串用于判断当天是否有日志 var montemp=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); if ((intDay == startDay) && (0 == daily)){ daily = 1;} var daytemp=daily<10?("0"+daily):(daily); var d="<"+newCal.getFullYear()+"-"+montemp+"-"+daytemp+">"; //选择样式 if(day==daily) cell.className="calendarNow"; else if(diarydays.indexOf(d)!=-1) cell.className="calendarLink"; else if(intDay==6) cell.className = "calendarDaySat"; else if (intDay==0) cell.className ="calendarDaySun"; else cell.className="calendarTd"; //生成值 if ((daily > 0) && (daily <= intDaysInMonth)) { cell.innerText = daily; daily++; } else cell.innerText = ""; } document.all.year.value=year; document.all.month.value=month+1; } function subMonth() { if ((month-1)<0) { month=11; year=year-1; } else { month=month-1; } Calendar(); } function addMonth() { if((month+1)>11) { month=0; year=year+1; } else { month=month+1; } Calendar(); } //得到响应事件 function getDiary() { var mon=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); var day=event.srcElement.innerText<10?("0"+event.srcElement.innerText):(event.srcElement.innerText); var d="<"+newCal.getFullYear()+"-"+mon+"-"+day+">"; if ("TD" == event.srcElement.tagName) if (("" != event.srcElement.innerText)&&(diarydays.indexOf(d)!=-1)) { diary.location="/chensheng913/archive/"+newCal.getFullYear()+"/"+mon+"/"+day+".aspx"; window.location.href = diary.location; } } function setDate() { if (document.all.month.value<1||document.all.month.value>12) { alert("月的有效范围在1-12之间!"); return; } year=Math.ceil(document.all.year.value); month=Math.ceil(document.all.month.value-1); Calendar(); } </SCRIPT> <table border="0" cellpadding="0" cellspacing="1" class="calendarBigBorder" id="caltable" width="200"> <thead> <tr align="center" valign="middle"> <td colspan="7" class="calendarMonthTitle"> <input name="year" type="text" class="calendarYInput" size="3" maxlength="4" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">年 <input name="month" type="text" class="calendarMInput" size="1" maxlength="2" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">月 [<a onClick="addMonth()" href="javascript:;">下月</a>] [<a onClick="subMonth()" href="javascript:;">上月</a>]</td> </tr> <tr align="center" valign="middle"> <SCRIPT LANGUAGE="JavaScript"> document.write("<TD class=calendarDaySun id=diary>" + days[0] + "</TD>"); for (var intLoop = 1; intLoop < days.length-1; intLoop++) document.write("<TD class=calendarTd id=diary>" + days[intLoop] + "</TD>"); document.write("<TD class=calendarDaySat id=diary>" + days[intLoop] + "</TD>"); </SCRIPT> </TR> </thead> <TBODY border=1 cellspacing="0" cellpadding="0" ID="calendar" ALIGN=CENTER ONCLICK="getDiary()" onmouseup=document.selection.empty() oncontextmenu="return false" onselectstart="return false" ondragstart="return false" onbeforecopy="return false" oncopy=document.selection.empty() onselect=document.selection.empty()> <SCRIPT LANGUAGE="JavaScript"> for (var intWeeks = 0; intWeeks < 6; intWeeks++) { document.write("<TR style='cursor:hand'>"); for (var intDays = 0; intDays < days.length;intDays++) document.write("<TD class=calendarTd onMouseover='{classTemp=this.className;this.className=calendarHover}' onMouseOut='this.className=classTemp'></TD>"); document.write("</TR>"); } </SCRIPT> </tbody> </table> <script LANGUAGE="JavaScript"> Calendar(); </script> <!-- Blog日历表结束 --> <p><b>天气预报</b></p> <!--<iframe width=150 height=240 frameborder=0 scrolling=NO src="http://appnews.qq.com/cgi-bin/news_qq_search?city=%CE%DA%C2%B3%C4%BE%C6%EB&cll"></iframe>--></center> <script language="javascript"> document.getElementById("Header1_HeaderTitle").outerHTML="<table><tr><td><img src='http://www.5see.com/demo/gif/rwl/boy/1/Boy10.gif' border='0' >&nbsp;</td><td><a href='http://blog.csdn.net/chensheng913/' style='color:#ffffff;font-size:28pt'> <b>&nbsp键者天行</b></a></td><td></tr></table>"; function window.onload() { var els=document.getElementById("main").document.getElementsByTagName("DIV"); for(i=0;i<els.length;i++) { if(els[i].className=="postTitle") els[i].innerHTML="<img src='http://blog.csdn.net/images/blog_csdn_net/asklxf/16543/o_article.gif' border='0'>&nbsp;"+els[i].innerHTML; } els=document.getElementById("main").document.getElementsByTagName("H3"); for(i=0;i<els.length;i++) { if(els[i].innerHTML=="公告") els[i].innerHTML="天道酬勤<img src=http://blog.csdn.net/images/blog_csdn_net/asklxf/16543/o_new.gif>" } } try{ var currentpos,timer; function initialize() { timer=setInterval('scrollwindow()',10); } function sc(){ clearInterval(timer); } function scrollwindow() { currentpos=document.body.scrollTop; window.scroll(0,++currentpos); if (currentpos != document.body.scrollTop) sc(); } document.onmousedown=sc; document.ondblclick=initialize; } catch (exceptionObj) { } </script>
文章分类
友情Blog
!Java的专栏
Baggico的专栏
feng_sundy的专栏
八进制的专栏
嘟嘟狼的专栏
潇潇的新生活
笨笨的专栏
编程夜未眠的专栏
阿赖的个性空间
韩磊的专栏
珍藏链接
《CSDN社区电子杂志-Java杂志》官方Blog
《CSDN社区电子杂志-Oracle杂志》官方Blog
侯捷专栏
执子之手,与子偕老
王森专栏
科诺专栏
蔡学镛专栏
存档

转载  为你的程序锦上添花的五种程序组织形式 收藏

形式一."见兔撒鹰".
                                                                                    
   如果有一个类有一个集合成员,可以在为此成员添加元素时再把具体集合建立起来,以免浪费空间和时间.

例:

 1 public class Company{
 2     private List members=null
;
 3 

 4     public void addMember(Member member){
 5      if(members=null
){
 6     members=new
 ArrayList();
 7 
      }
 8 

 9      members.add(member);
10 
    }
11 
}
12 

异曲同工的另外一个例子:

 1 public class Singleton{
 2        private static Singleton instance=null
;
 3 

 4        public static synchronized Singleton getInstance(){
 5    // 要用的时候再把Singleton建立起来

 6    if(instance==null){
 7      instance=new
 Singleton();
 8 
   }       
 9 

10    return instance;
11 
       }
12 
}
13 

形式二."只管结果,不顾过程"

  从集合中取区间元素时,可以直接从上下限之间取来,让try...catch...去处理越界的事.

题设:有个数不定元素的列表(allTodoes),需要从中取N个,起始位置不限,你怎么编写程序.

    很多人开始进行越界的判断,出来一堆if else,有时还需要在纸上写好思路,完毕后还有多方测试,生怕出错,即使编写好后其他人维护起来也是小心翼翼的.其实没必要这么麻烦.

例.

 1   int start=pageIndex*pageSize;
 2   int end=start+
pageSize;
 3 
  
 4   for(int i=start;i<end;i++
){
 5    try
{
 6 
    todoResult.addTodo((Todo)allTodoes.get(i));
 7 
   }
 8    catch
(Exception ex){
 9     continue
;
10 
   }
11   }

题外话:分支和循环语句天生就不容易理解,尤其是在嵌套较深的时候,因为这是机器的思维特性.还是try...catch...比较贴近人类思维.


形式三."奉旨行事"
   在查询中,如果把查询条件和遴选过程分开来更有益,程序也因此解耦合.这才是OO化的查询.

需求:从公司的职员列表中,找出男性且年龄大于22的成员.

传统写法: 

 1  List allmembers=company.getMembers();// 取得所有成员
 2   List results=new ArrayList();// 结果列表
 3   
 4   for(Iterator it=
allmembers.iterator();it.hasNext();){
 5    Member member=
(Member)it.next();
 6 
   
 7    if(member.getAge()>22 && member.isMale()){  // 筛选,这里是把查询条件和遴选过程融合在一起,条件一变立即就得加个分支.

 8     results.add(member);
 9 
   }
10 
  } 
11 

 

这种写法没有错,但是不是面向对象的写法,它有以下缺陷:
1.查询条件和筛选过程没有分离.
2.这样写的后果使Company变成了一个失血模型而不是领域模型.
3.换查询条件的话,上面除了"筛选"一句有变化外其它都是模板代码,重复性很高.

真正符合OO的查询应该是这样:

1   MemberFilter filter1=new MemberFilter(){
2    public boolean
 accept(Member member) {
3         return member.isMale() && member.getAge()>22
;
4 
   }
5 
  };
6 
  
7   List ls=company.listMembers(filter1);

 

这段代码成功的把查询条件作为一个接口分离了出去,接口代码如下:

1 public interface MemberFilter{
2  public boolean
 accept(Member member); 
3 }

而类Company增加了这样一个函数:

 1  public List listMembers(MemberFilter memberFilter){
 2   List retval=new
 ArrayList();
 3 
  
 4   for(Iterator it=
members.iterator();it.hasNext();){
 5    Member member=
(Member)it.next();
 6 
   
 7    if
(memberFilter.accept(member)){
 8 
    retval.add(member);
 9 
   }
10 
  }  
11 
  
12   return
 retval;
13  }

这就把模板代码归结到了类内部,外面不会重复书写了.Company也同时拥有了数据和行为,而不是原来的数据容器了.

形式四."化繁为简"
    这种结构将多个分支语句变换为一个查表结构,这样做对扩充程序结构,修改具体数额都很方便,使程序更易于维护.还可以把归结出的表结构放在持久介质中如XML文件,数据库等,用到的时候再取,这样做在条件变化时不需要修改程序.

原始代码(VB代码,但应该不妨碍理解):

 1 Dim count1 
 2 count1 = salary.Value + USA.Value * Drate + JAN.Value * Jrate - 4000
 
 3 If count1 < 500 Then
 
 4  tax.Value = count1 * 0.05
 
 5 ElseIf count1 < 2000 Then
 
 6  tax.Value = count1 * 0.1 - 25
 
 7 ElseIf count1 < 5000 Then
 
 8  tax.Value = count1 * 0.15 - 125
 
 9 ElseIf count1 < 20000 Then
 
10  tax.Value = count1 * 0.2 - 375
 
11 ElseIf count1 < 40000 Then
 
12  tax.Value = count1 * 0.25 - 1375
 
13 ElseIf count1 < 60000 Then
 
14  tax.Value = count1 * 0.3 - 3375
 
15 Else
 
16  tax.Value = count1 * 0.3 - 3375
 
17 End If 

变换如下:
这是个税率计算的语句段,公式是确定的:税=月薪*税率-折扣,税率又和月薪有关系,月薪越高税率越高,首先这里可以归纳出一个基本类:

 1 public class TaxItem{
 2  float limit; // 月薪界限

 3  float ratio;// 税率
 4  float discount;// 折扣
 5 
 6  public TaxItem(float limit,float ratio,float discount){
 7   this.limit=
limit;
 8   this.ratio=
ratio;
 9   this.discount=
discount;
10 
 }
11 

12  public TaxItem(){
13   this(0.0f,0.0f,0.0f
);
14 
 }
15 

16  public float getDiscount() {
17   return
 discount;
18 
 }
19 

20  public float getLimit() {
21   return
 limit;
22 
 }
23 

24  public float getRatio() {
25   return
 ratio;
26 
 }
27 
}
28 

29 


然后就是税计算类:

 1 public class TaxCaculator{
 2         private static ArrayList list=new
 ArrayList();
 3 
        
 4         public
 TaxCaculator(){
 5                 // 这里把各个等级加入到链表中,注意添加顺序是由小到大

 6                 list.add(new TaxItem(500.0f,0.05f,0.0f));
 7                 list.add(new TaxItem(2000.0f,0.1f,25.0f
));
 8                 list.add(new TaxItem(5000.0f,0.15f,125.0f
));
 9                 list.add(new TaxItem(20000.0f,0.2f,375.0f
));
10                 list.add(new TaxItem(40000.0f,0.25f,1375.0f
));
11                 list.add(new TaxItem(60000.0f,0.3f,3375.0f
));
12 
        }
13 
        
14         // 这个函数用来计算所得税

15         public float getTax(float salary){
16                 TaxItem item=new
 TaxItem();
17 
                
18                 for(int i=0;i<list.size();i++
){
19                         item=
(TaxItem)list.get(i);
20 
                        
21                         if(salary>
item.getLimit()){
22                                 continue
;
23 
                        }
24                         else
{
25                                 break
;
26 
                        }
27 
                }               
28 
                
29                 // 返回最终结果,当然,这个公式也可以放在TaxItem 类中,这里就见仁见智了。

30                 return salary*item.getRatio()-item.getDiscount();
31 
        }
32 }



调用如下 :

 1                 TaxCaculator taxCaculator=new TaxCaculator();
 2 
                
 3                 float salary=1000
.f;    
 4                 System.out.println("Salary="+salary +" Tax="+
taxCaculator.getTax(salary));
 5 
                
 6                 salary=2000
.f;  
 7                 System.out.println("Salary="+salary +" Tax="+
taxCaculator.getTax(salary));
 8 
                
 9                 salary=3000
.f;  
10                 System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));


 形式五."分而治之"
    该结构将分支语句的执行部分分散到单独的类中处理,降低了系统耦合度,程序也更容易维护.

举例如下:
在日常工作中,我们经常需要解析一段字符串并交由相应的函数进行处理,例如TCP/IP通信中的命令解析和用户自定义文件解析等场合,通常的处理方法是这样:

if(命令==”AAA”){
    函数AAA执行;
}
else if(命令==”BBB”){
    函数BBB执行;
}
.
.
.
else{
    函数XXX执行;
}

这种方法在命令较少时是有效的,当命令众多时,if语句和相关的函数将会形成一个巨集,给检查,维护和扩充带来了很大的不便,久而久之将会成为系统性能提升的瓶颈。

一个成功的软件程序必须尽可能简单并易于重构和扩展,在命令模式和Java反射机制的帮助下,我们可以从容解决上述问题,达到简单并易于重构和扩展的要求。以下将简要说明解决方案。

1. 制作一个命令的抽象接口.

1 public interface Command{ 
2        public abstract void
 execute(String[] args); 
3 

 

2. 让每种命令都实现这个接口.

 1 // 命令一 
 2 public class CommandType01 implements Command{ 
 3        public void
 execute(String[] args){ 
 4                System.out.println("\n commandType01 start!"
);           
 5                System.out.print("\t commandType01 Length="+
args.length);                
 6                System.out.println("\n commandType01 End!"
); 
 7 
       } 
 8 

 9 

10 // 命令二 
11 public class CommandType02 implements Command{ 
12        public void
 execute(String[] args){ 
13                System.out.println("\n commandType02 start!"
);           
14 
                
15                System.out.print("\t commandType02 is:"
);                
16                for
(String item:args){ 
17                        System.out.print("\t "+
item); 
18 
               } 
19 
                
20                System.out.println("\n commandType02 End!"
); 
21 
       } 
22 

23 

24 // 命令三 
25 public class CommandType03 implements Command{ 
26        public void
 execute(String[] args){ 
27                System.out.println("\n commandType03 start!"
);           
28                System.out.print("\t commandType03 last Nation="+args[args.length-1
]);           
29                System.out.println("\n commandType03 End!"
); 
30 
       } 
31 

32 

33 


让每种命令都实现execute接口的用意是强制每个命令的执行方式一致,简化调用时的处理,但执行内容应该根据实际情况决定.
例如
命令一的执行内容是输出参数的个数
命令二的执行内容是输出参数的内容
命令三的执行内容是输出最后一个参数

3. 将命令防置到命令中心中去
命令中心类的代码如下:

 1 public class Mediation{ 
 2        Command cmmd;// 命令对象的引用 

 3        String[] cmmdArgs;// 参数列表 
 4         
 5        public
 Mediation(){ 
 6 
                
 7 
       } 
 8 
        
 9        public void
 fetchCommand(String strCmmd){ 
10                cmmdArgs=strCmmd.split("\s+");// 分析原始命令 

11                 
12                String className="Command"+cmmdArgs[0];// 根据分析后命令的第一个参数得到类名 

13                 
14                try

15                        Class cls=Class.forName(className);// 利用反射机制得到类 

16                        cmmd=(Command)cls.newInstance();// 由类得到类实例 
17                } 
18                catch
(Exception ex){ 
19 
                       ex.printStackTrace(); 
20 
               }                
21 
       }        
22 

23         
24        public void
 executeCommand(){ 
25                cmmd.execute(cmmdArgs);// 执行命令对象的execute方法 

26        } 
27 

28 


4.执行过程

 1                Mediation mediation = new Mediation(); 
 2                // 取得命令一并执行 

 3                mediation.fetchCommand("Type01  AB CD"); 
 4 
               mediation.executeCommand(); 
 5 

 6                // 取得命令二并执行 
 7                mediation.fetchCommand("Type02  1 2 3 4"); 
 8 
               mediation.executeCommand(); 
 9 

10                // 取得命令三并执行 
11                mediation.fetchCommand("Type03  USA  Russia China"); 
12 
               mediation.executeCommand(); 
13 

执行效果如下:
commandType01 start!
        commandType01 Length=3
commandType01 End!

commandType02 start!
        commandType02 is:       Type02  1       2       3       4
commandType02 End!

commandType03 start!
        commandType03 last Nation=China
commandType03 End!

    由上可见,我们使用反射机制消除了庞大的分支语句,把命令的执行过程分散到了Command的各个子类中,降低了命令类和控制中心类的耦合程度,达到了简单并易于重构和扩展的要求。如果新增一种命令,只需增加Command的一个子类就可以了。
很多情况下命令的execute函数需要命令中心类或者其它类的信息,这时可以在Command接口类和Command的子类中间添加一个类CommandBase,在其中包含一个命令中心类或者其它类的引用,并增加相应的getter/setter函数,Command的子类继承这个类并实现Command的接口即可,最后在fetchCommand函数中传入中心类或者其它类的引用即可。

注意:这里对命令和Command的子类类名有特殊要求,即一种命令对应一种子类,子类类名可以由命令的首个参数简单组合而来,否则还是避免不了分支语句。 

以上五种组织形式,若加以灵活运用,相信能减少一些代码臭味.
 

发表于 @ 2007年06月22日 19:33:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:oracle9i ---设置DBA认证方式 | 新一篇:怎样成为优秀的软件模型设计者

  • 发表评论
  • 评论内容:
  •  
Copyright © chensheng913
Powered by CSDN Blog