
2005年8月12日
模板模式:
模板方法中分兩種方法:一種是模板方法,另一種是基本方法。
模板方法:就是把基本方法組合在一起形成一個(gè)總算法或則總行為,這個(gè)模板方法一般會在抽象定義并且在子類種不加以修改的繼承下來。一個(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 閱讀(373) |
評論 (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è)文件夾,如果是的話,則取消打印"│"符號
*/
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);
}
}
/*
* 格式化打印,將符號最后的"──"變?yōu)?├──"(當(dāng)最后的符號不為"│──"時(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è)"│"符號,并標(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)記過,則將上一次的"│"符號刪除
*/
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 閱讀(577) |
評論 (0) |
編輯 收藏
策略模式:
策略模式的對算法的包裝,是把使用算法的責(zé)任和算法本生分開,委派給不同的對象管理。策略模式通常把一個(gè)系列的算法包裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。
使用條件:
如果在一個(gè)系統(tǒng)種有許多類,他們之間的區(qū)別僅僅在于他們的行為,并且這個(gè)系統(tǒng)需要?jiǎng)討B(tài)的在幾種算法種選擇一種。
posted @
2005-08-14 23:51 sky 閱讀(190) |
評論 (0) |
編輯 收藏
不變模式:
不變模式可以增強(qiáng)對象的強(qiáng)壯性,不變模式準(zhǔn)許多個(gè)對象共享一個(gè)對象,這降低了對該對象進(jìn)行并發(fā)訪問時(shí)的同步化開銷。如果要修改一個(gè)不變對象的狀態(tài),則需要?jiǎng)?chuàng)建一個(gè)新的對象,并將其存入新的對象里。不變模式只涉及到一個(gè)類,一個(gè)類的內(nèi)部狀態(tài)一旦被創(chuàng)建以后,在整個(gè)期間都不會發(fā)生變化。他有兩種一種是強(qiáng)不變模式和弱不變模式。
弱不變模式:
首先滿足沒有方法可以改變對象的狀態(tài),則對象一旦被創(chuàng)建之后,對象的狀態(tài)就不會改變。二該對象的所有的屬性都是私有的,并且不準(zhǔn)許聲明任何公有的方法來改變他們。三這個(gè)對象所引用的對象也應(yīng)該是不變的對象,如果在初始化時(shí)應(yīng)用了一個(gè)可變的對象,則應(yīng)該對該可變對象進(jìn)行復(fù)制一份,而不要使用原來的拷貝。這種模式的缺點(diǎn)是他可以用子類,并且子類可以是可變的對象。可變的子類可能一修改父類對象的狀態(tài),從而可能會允許外界修改父對象的狀態(tài)。
問題: 為什么說可變的對象可以修該父類對象的狀態(tài)呢?怎樣做?
強(qiáng)不變模式首先要滿足弱不變模式,然后將這個(gè)類聲明成final類,則它變不可能有子類了,并且也將該對象所考慮到的所有方法聲明為final。
不變模式與享元模式有很大的相同處,他們的對象狀態(tài)都有要求不隨環(huán)境的變化而變化,不過享元模式的內(nèi)涵狀態(tài)在不影響享元對象的共享時(shí),可以為可變的。不變模式對對象的要求要比享元模式對對象的要求更嚴(yán)格。
posted @
2005-08-14 23:39 sky 閱讀(639) |
評論 (2) |
編輯 收藏
橋梁模式:
橋梁模式就是抽象化和實(shí)現(xiàn)化脫藕,使得兩者可以獨(dú)立地變法。例子如java中的peer架構(gòu)。
橋梁模式與適配器模式的區(qū)別是,
posted @
2005-08-12 23:28 sky 閱讀(330) |
評論 (0) |
編輯 收藏
門面模式:
在外界訪問要訪問多個(gè)內(nèi)部系統(tǒng)時(shí),并且他與這些內(nèi)部系統(tǒng)有著復(fù)雜的關(guān)系時(shí),我們則可以用門面模式來解決這樣的問題。
門面模式他只是提供一個(gè)可以共外界方便訪問內(nèi)部子系統(tǒng)的一個(gè)接口,他并不會對子系統(tǒng)進(jìn)行擴(kuò)展,他只提供子系統(tǒng)所具有的方法。對外界來說,他是一個(gè)子系統(tǒng),但是內(nèi)部的子系統(tǒng)并不知道有這么一個(gè)類。例如:一個(gè)學(xué)生要去圖書館借書,這里有3個(gè)表,rule是記錄不同的讀者的借書規(guī)則(如研究生可以借7而本科生只能借4本),publish表是記錄過期未還書的學(xué)生,passwork是記錄圖書館所頒發(fā)過的借書證。如果一個(gè)學(xué)生要借書,則他必須要有一個(gè)在passwork中存在的借書證,并且沒有在publish中的情況,則可以保證向該學(xué)生提供借閱,但是借閱的書則要按rule中的規(guī)則來進(jìn)行。所以一個(gè)學(xué)生client借書必須訪問這些類,為了便于管理,我們提供一個(gè) FacadeFactory類來處理,這個(gè)類提供了所有client向子系統(tǒng)訪問的方法。這樣對于client來說就輕松多了,也便于我們維護(hù)代碼了。但是FacadeFactory不能夠向client提供內(nèi)部子系統(tǒng)不存在的方法。
由于一個(gè)系統(tǒng)中所需要的只需要一個(gè)實(shí)例,則我們可以把門面類設(shè)置為單例類,如上面的FacadeFactory,他應(yīng)該設(shè)置為一個(gè)單例類,這樣就不會發(fā)生多個(gè)人同時(shí)借一本書了。
posted @
2005-08-12 19:38 sky 閱讀(233) |
評論 (0) |
編輯 收藏