隨筆-19  評(píng)論-2  文章-1  trackbacks-0
            2005年8月14日
          模板模式:
                 
                   模板方法中分兩種方法:一種是模板方法,另一種是基本方法。
                   模板方法:就是把基本方法組合在一起形成一個(gè)總算法或則總行為,這個(gè)模板方法一般會(huì)在抽象定義并且在子類種不加以修改的繼承下來。一個(gè)抽象類可以有任意多個(gè)模板方法。
                   基本方法:它又分為抽象方法,具體方法,鉤子方法。
                抽象方法由抽象類申明,由子類具體實(shí)現(xiàn);具體方法由抽象類申明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或則置換,這里面也可以有工廠方法;鉤子方法,由抽象類申明并實(shí)現(xiàn),但是它是一個(gè)空的實(shí)現(xiàn),一般都是由子類進(jìn)行擴(kuò)張實(shí)現(xiàn)。
          posted @ 2005-08-19 21:15 sky 閱讀(375) | 評(píng)論 (0)編輯 收藏


          import java.io.*;

          public class FileRead{
           private static double totalFile = 0;
           private static double totalDirectory = 0;

           public String replace(String value){
               StringBuffer replace = new StringBuffer(value);
               int i = 0;
               int last = replace.lastIndexOf("──");
               i = replace.indexOf("──");
               while((i != last)&&(i != -1)){
                   replace.replace(i,i+"──".length(),"   ");
                   i = replace.indexOf("──");
                   last = replace.lastIndexOf("──");
               }
               return replace.toString();
           }

           public void searchFile(File f,String value,boolean b)throws IOException{
               StringBuffer string = new StringBuffer(value);
               string.append("──");
               boolean bool = b;
            String path = f.getAbsolutePath();
            File currentFile = new File(path); //取得當(dāng)前路徑的文件
            File[] file = currentFile.listFiles();

            for(int i=0;i<file.length;i++){      
                StringBuffer s = null;
                String lastDirectory = null; 
               
                /*
                 * 判斷文件夾是否為該目錄下的最后一個(gè)文件夾,如果是的話,則取消打印"│"符號(hào)
                 */
                for(int k=0;k<file.length;k++){
                 if(file[k].isDirectory())
                  lastDirectory = new String(file[k].getName()); 
                }
                if(file[i].getName().equals(lastDirectory)){
                 if(string.indexOf("│") != -1){
                     string.delete(string.lastIndexOf("│"),string.lastIndexOf("│")+1);
                 }
                }
                 
                /*
                 * 格式化打印,將符號(hào)最后的"──"變?yōu)?├──"(當(dāng)最后的符號(hào)不為"│──"時(shí))
                 */     
                if(!((string.lastIndexOf("──")-1) == string.lastIndexOf("│──"))){
                    s = new StringBuffer(string.substring(0,string.lastIndexOf("──")));
                 s.append("├──");         
                }else{
                 if(string.indexOf("│──")!=-1){
                  s = new StringBuffer(string.substring(0,string.lastIndexOf("│──")));
                  s.append("├──");
                 }
                }
               
                if(file[i].getName().equals(file[file.length-1].getName()))
                 if(s != null)
                  if(s.lastIndexOf("├") != -1)
                   s.replace(s.lastIndexOf("├"),s.lastIndexOf("├")+1,"└");
               
                /*
                 * 如果s不為空,則將s傳入方法replace中進(jìn)行格式化
                 */
                if(s != null)           
                 System.out.println(replace(s.toString()) + file[i].getName());
                     
             if(file[i].isDirectory()){   
                 totalDirectory  += 1;
                  
                 /*
                  * 如果該文件夾的子目錄下還有兩個(gè)以上的文件和文件夾,則打印一個(gè)"│"符號(hào),并標(biāo)記bool為true
                  */
                     String pathstring = file[i].getAbsolutePath();
               File current = new File(pathstring); //取得當(dāng)前路徑的文件
               File[] fp = current.listFiles();
               if(fp.length >1){
                   bool = true;                  
               }
              
                 if(bool)
                  string.append("│");
                
                 searchFile(file[i],string.toString(),bool);
                
                 /*
                  * 如果bool已經(jīng)被標(biāo)記過,則將上一次的"│"符號(hào)刪除
                  */
                 if(bool)
                  if(string.indexOf("│") != -1)
                      string.delete(string.lastIndexOf("│"),string.length());
                 bool = false; 
             }
             totalFile += 1; 
            }
           } 
           public static void main(String args[])throws IOException{
            String path = null;
            if(args.length<1)
             path =".";
            else
             path = args[0];
            FileRead read = new FileRead();
            File file = new File(path);
            
            if(!file.exists()){
             System.err.print("the path is error");
             System.exit(1);
            } 
            read.searchFile(file,"│",false);
            System.out.println("the file is :" + (totalFile-totalDirectory));
            System.out.println("thd directory is : " + totalDirectory);
           }
          }

          該程序存在一個(gè)問題,也就是當(dāng)jdk中的File類無法判斷目錄下的一些目錄是文件夾或則是文件時(shí)?

          posted @ 2005-08-19 20:20 sky 閱讀(579) | 評(píng)論 (0)編輯 收藏
          策略模式:

                  策略模式的對(duì)算法的包裝,是把使用算法的責(zé)任和算法本生分開,委派給不同的對(duì)象管理。策略模式通常把一個(gè)系列的算法包裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。
          使用條件:
                  如果在一個(gè)系統(tǒng)種有許多類,他們之間的區(qū)別僅僅在于他們的行為,并且這個(gè)系統(tǒng)需要?jiǎng)討B(tài)的在幾種算法種選擇一種。       
          posted @ 2005-08-14 23:51 sky 閱讀(192) | 評(píng)論 (0)編輯 收藏
          不變模式:
                 
                  不變模式可以增強(qiáng)對(duì)象的強(qiáng)壯性,不變模式準(zhǔn)許多個(gè)對(duì)象共享一個(gè)對(duì)象,這降低了對(duì)該對(duì)象進(jìn)行并發(fā)訪問時(shí)的同步化開銷。如果要修改一個(gè)不變對(duì)象的狀態(tài),則需要?jiǎng)?chuàng)建一個(gè)新的對(duì)象,并將其存入新的對(duì)象里。不變模式只涉及到一個(gè)類,一個(gè)類的內(nèi)部狀態(tài)一旦被創(chuàng)建以后,在整個(gè)期間都不會(huì)發(fā)生變化。他有兩種一種是強(qiáng)不變模式和弱不變模式。
                  弱不變模式:
          首先滿足沒有方法可以改變對(duì)象的狀態(tài),則對(duì)象一旦被創(chuàng)建之后,對(duì)象的狀態(tài)就不會(huì)改變。二該對(duì)象的所有的屬性都是私有的,并且不準(zhǔn)許聲明任何公有的方法來改變他們。三這個(gè)對(duì)象所引用的對(duì)象也應(yīng)該是不變的對(duì)象,如果在初始化時(shí)應(yīng)用了一個(gè)可變的對(duì)象,則應(yīng)該對(duì)該可變對(duì)象進(jìn)行復(fù)制一份,而不要使用原來的拷貝。這種模式的缺點(diǎn)是他可以用子類,并且子類可以是可變的對(duì)象。可變的子類可能一修改父類對(duì)象的狀態(tài),從而可能會(huì)允許外界修改父對(duì)象的狀態(tài)。

          問題:
                 為什么說可變的對(duì)象可以修該父類對(duì)象的狀態(tài)呢?怎樣做?

          強(qiáng)不變模式首先要滿足弱不變模式,然后將這個(gè)類聲明成final類,則它變不可能有子類了,并且也將該對(duì)象所考慮到的所有方法聲明為final。
          不變模式與享元模式有很大的相同處,他們的對(duì)象狀態(tài)都有要求不隨環(huán)境的變化而變化,不過享元模式的內(nèi)涵狀態(tài)在不影響享元對(duì)象的共享時(shí),可以為可變的。不變模式對(duì)對(duì)象的要求要比享元模式對(duì)對(duì)象的要求更嚴(yán)格。


          posted @ 2005-08-14 23:39 sky 閱讀(644) | 評(píng)論 (2)編輯 收藏
          主站蜘蛛池模板: 景谷| 芜湖市| 樟树市| 灌阳县| 南平市| 陵川县| 洪雅县| 天气| 乐昌市| 马山县| 武清区| 法库县| 靖安县| 龙井市| 神农架林区| 凤庆县| 麟游县| 琼结县| 济源市| 无为县| 廊坊市| 普安县| 古田县| 宽城| 田林县| 顺昌县| 云林县| 左贡县| 丹阳市| 来宾市| 汾西县| 苍溪县| 安新县| 隆回县| 宜兰市| 北票市| 赣州市| 武冈市| 开阳县| 呼图壁县| 卓资县|