項目中 if else 過多的思考

項目中太多的if...else 添加需求 又需要添加一個 else if() ...? 擴(kuò)展性及其不好.

首先在知乎上看到一個大神的解決方案,非常的不錯.

https://zhuanlan.zhihu.com/p/33383648

實現(xiàn)原理:? 通過策略模式+工廠模式+反射解決了 if else 的問題


比如有N多家 銀行 的 計算方法都 不同 ,如果用 if ..else 去編寫代碼,那會非常的不好,代碼中 if .. else 會非常多? 也不符合 開閉原則

比如有2家 一家是 農(nóng)業(yè)銀行 , 一家是 工商銀行 , 用枚舉來定義 銀行的列表, 這樣返回給前段的時候? ?枚舉名稱就是 銀行的 type



自定義注解:



在策略的具體實現(xiàn)類上面 標(biāo)注這個 注解


策略接口:

策略實現(xiàn)類:







通過工廠來創(chuàng)建對象:




ClassUtil的代碼:

public class ClassUtil {public static HashMapgetClasses(String pack) {// 定義一個MAP用于存放type 和類路徑的映射HashMapmap = new HashMap();// 是否循環(huán)迭代boolean recursive = true;// 獲取包的名字 并進(jìn)行替換String packageName = pack;String packageDirName = packageName.replace('.', '/');// 定義一個枚舉的集合 并進(jìn)行循環(huán)來處理這個目錄下的thingsEnumerationdirs;try {dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);// 循環(huán)迭代下去while (dirs.hasMoreElements()) {// 獲取下一個元素URL url = dirs.nextElement();// 得到協(xié)議的名稱String protocol = url.getProtocol();// 如果是以文件的形式保存在服務(wù)器上if ("file".equals(protocol)) {// 獲取包的物理路徑String filePath = URLDecoder.decode(url.getFile(), "UTF-8");// 以文件的方式掃描整個包下的文件 并添加到集合中findAndAddClassesInPackageByFile(packageName, filePath,recursive, map);}}} catch (IOException e) {e.printStackTrace();}return map;}@SuppressWarnings("rawtypes")public static void findAndAddClassesInPackageByFile(String packageName,String packagePath, final boolean recursive,Map map) {

// 獲取此包的目錄 建立一個File

File dir = new File(packagePath);

// 如果不存在或者 也不是目錄就直接返回

if (!dir.exists() || !dir.isDirectory()) {

// log.warn("用戶定義包名 " + packageName + " 下沒有任何文件");

return;

}

// 如果存在 就獲取包下的所有文件 包括目錄

File[] dirfiles = dir.listFiles(new FileFilter() {

// 自定義過濾規(guī)則 如果可以循環(huán)(包含子目錄) 或則是以.class結(jié)尾的文件(編譯好的java類文件)

public boolean accept(File file) {

return (recursive && file.isDirectory())

|| (file.getName().endsWith(".class"));

}

});

// 循環(huán)所有文件

for (File file : dirfiles) {

// 如果是目錄 則繼續(xù)掃描

if (file.isDirectory()) {

findAndAddClassesInPackageByFile(

packageName + "." + file.getName(),

file.getAbsolutePath(), recursive, map);

} else {

// 如果是java類文件 去掉后面的.class 只留下類名

String className = file.getName().substring(0,

file.getName().length() - 6);

try {

String fullPath = packageName + '.' + className;

// 使用注解塞map

Class clazz = Class.forName(fullPath);

Annotation[] annotations = clazz.getAnnotations();

for (Annotation annotation : annotations) {

//可以根據(jù)類型判斷? 讀取不同類型 注解的值? put map 中

Pay pay = (Pay)annotation;

map.put(String.valueOf(pay.value()),fullPath);

}

} catch (ClassNotFoundException e) {

// log.error("添加用戶自定義視圖類錯誤 找不到此類的.class文件");

e.printStackTrace();

}

}

}

}

}


策略上下文對象:



測試類代碼:





這是一位大神實現(xiàn)的方式...........................................


下面來談?wù)勎业睦斫?

可以用注解來標(biāo)注實現(xiàn)類

枚舉來定義具體多少種類型

這樣的話 通過注解和枚舉的組合來反射實例化具體的實現(xiàn)類,最后調(diào)用不通的策略實現(xiàn). 你get 到了 嗎?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潮饱,一起剝皮案震驚了整個濱河市立倍,隨后出現(xiàn)的幾起案子抑进,更是在濱河造成了極大的恐慌巡语,老刑警劉巖暂幼,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糊肤,死亡現(xiàn)場離奇詭異病涨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疙描,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門诚隙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淫痰,你說我怎么就攤上這事最楷≌荩” “怎么了待错?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烈评。 經(jīng)常有香客問我火俄,道長,這世上最難降的妖魔是什么讲冠? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任瓜客,我火速辦了婚禮,結(jié)果婚禮上竿开,老公的妹妹穿的比我還像新娘谱仪。我一直安慰自己,他們只是感情好否彩,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布疯攒。 她就那樣靜靜地躺著,像睡著了一般列荔。 火紅的嫁衣襯著肌膚如雪敬尺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天贴浙,我揣著相機(jī)與錄音砂吞,去河邊找鬼。 笑死崎溃,一個胖子當(dāng)著我的面吹牛蜻直,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼概而,長吁一口氣:“原來是場噩夢啊……” “哼唤殴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起到腥,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤朵逝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乡范,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體配名,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年晋辆,在試婚紗的時候發(fā)現(xiàn)自己被綠了渠脉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓶佳,死狀恐怖芋膘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霸饲,我是刑警寧澤为朋,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站厚脉,受9級特大地震影響习寸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傻工,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一霞溪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧中捆,春花似錦鸯匹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臂容,卻和暖如春科雳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脓杉。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工糟秘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人球散。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓尿赚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凌净,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容