新秀翻譯(兩) 使用Java通用配置模板方法模式

2021-09-22 09:14:20 字數 2510 閱讀 6386

假設你發現你已經非常重碼,你可能會考慮使用模板的方法來消除easy重複錯誤**。下面是乙個示例:以下兩類,他完成了幾乎相同的功能:

例項化並初始化乙個reader來讀取csv檔案。

讀取每一行並解析;

把每一行的字元填充到product或customer物件;

將每個物件加入到set裡;

返回set。

正如你看到的,僅僅有有凝視的地方是不一樣的。其它全部步驟都是同樣的。

public class productcsvreader 

}return returnset;

}}

public class customercsvreader 

}return returnset;

}}

對於本例來說,僅僅有兩個實體,可是乙個真正的系統可能有幾十個實體,所以有非常多反覆易錯的**。

你可能會發現dao層有著同樣的情況。在每個dao進行增刪改查的時候差點兒都是同樣的操作。唯一與不同的是實體和表。讓我們重構這些煩人的**吧。依據gof設計模式第一部分提到的原則之中的乙個,我們應該「封裝不同的概念「productcsvreader和customercsvreader之間,不同的是有凝視的**。所以我們要做的是。把同樣的放到乙個類。不同的抽取到還有乙個類。我們先開始編寫productcsvreader,我們使用extract method提取帶凝視的部分:

public class productcsvreader 

}return returnset;

}product unmarshall(string tokens)

}

如今我們已經把同樣(反覆)的**和不同(各自特有)的**分開了,我們要建立乙個父類abstractcsvreader,它包括兩個類(productreader和customerreader)同樣的部分。我們把它定義為乙個抽象類。由於我們不須要例項化它。然後我們將使用pull up method重構這個父類。

abstract class abstractcsvreader 

}return returnset;

}}

public class productcsvreader extends abstractcsvreader 

}

假設在子類中沒有『unmarshall』方法,該類就無法進行編譯(它呼叫unmarshall方法),所以我們要建立乙個叫unmarshall的抽象方法。

abstract class abstractcsvreader 

}return returnset;

}abstract product unmarshall(string tokens);

}

如今。在這一點上,abstractcsvreader是productcsvreader的父類,但不是customercsvreader的父類。假設customercsvreader繼承abstractcsvreader編譯會報錯。為了解決問題我們使用泛型。

abstract class abstractcsvreader

}return returnset;

}abstract t unmarshall(string tokens);

}

public class productcsvreader extends abstractcsvreader

}

public class customercsvreader extends abstractcsvreader

}

這就是我們要的!

不再有反覆的**。父類中的方法是「模板」,它包括這不變的**。那些變化的東西作為抽象方法。在子類中實現。記住,當你重構的時候,你應該有自己主動化的單元測試來保證你不會破壞你的**。

我使用junit,你能夠使用我帖在這裡的**,也能夠在這個github庫找一些其它設計模式的樣例。在結束之前,我想說一下模板方法的缺點。模板方法依賴於繼承。患有 the fragile base class problem。簡單的說就是,改動父類會對繼承它的子類造成意想不到的不良影響。其實,基礎設計原則之中的乙個的gof設計模式提倡「多用組合少用繼承」。而且更多設計模式也告訴你怎樣避免**反覆,同一時候又讓複雜或easy出錯的**盡量少的依賴繼承。歡迎交流,以便我能夠提高我的部落格質量。

翻譯的不好。歡迎拍磚。

新秀翻譯(兩) 使用Java通用配置模板方法模式

假設你發現你已經非常重碼,你可能會考慮使用模板的方法來消除easy重複錯誤 下面是乙個示例 以下兩類,他完成了幾乎相同的功能 例項化並初始化乙個reader來讀取csv檔案。讀取每一行並解析 把每一行的字元填充到product或customer物件 將每個物件加入到set裡 返回set。正如你看到的...

phpmyadmin普通使用者使用配置

正常情況需求是,普通使用者可以管理特定的資料庫,可能也需要能新建資料庫,配置如下 1 新增使用者,phpmyadmin和應用訪問,所以主機設定127.0.0.1訪問即可 2 如果只管理乙個資料,可以選擇建立第二項,如果需要建立資料庫,選擇第三項,選第三項後使用者可以自由建立以 使用者名稱 開頭的資料...

使用java的兩個注意點

1.不要在foreach迴圈裡進行元素的remove add操作,remove元素請使用iterator方式,iterator物件加鎖。2.在jdk7版本及以上,comparator要滿足如下三個條件,不然arrays.sort,collections.sort會報illegalargumentex...