假設你發現你已經非常重碼,你可能會考慮使用模板的方法來消除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...