日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java如何利用狀態模式(state pattern)替代if else

瀏覽:89日期:2022-08-20 18:23:51

大多數開發人員現在還在使用if else的過程結構,曾看過jdon的banq大哥寫的一篇文章,利用command,aop模式替代if else過程結構。當時還不太明白,這幾天看了《重構》第一章的影片租賃案例,感觸頗深。下面我來談一談為什么要用state pattern替代if else,替代if else有什么好處,以及給出詳細代碼怎么替代if else。本文參考jdon的“你還在使用if else嗎?”及《重構》第一章。

首先我們模仿影片租賃過程,顧客租憑影片,影片分為兒童片、普通片、新片。根據影片類型及租憑天數價格各不相同(優惠程度不同),用戶累計積分不同。

OK ,現在我們使用 if else 表示。

package com.qujingbo.movie; /** * <p/> Title:影片基類 * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 15:47:55 * </p> * * @author EOMS 曲靜波 * @version 1.0 */ public class Movie { // 普通片標識 public static int REGULAR = 1 ; // 新片標識 public static int NEW_RELEASE = 2 ; // 兒童片標識 public static int CHILDREN = 3 ; /** * 獲取租賃影片總價 * * @param movieCode * 影片類型 * @param days * 租憑天數 * @return 租賃影片總價 * @throws MovieException * 沒有影片類型拋出異常 */ public double getCharge( int movieCode, int days) throws MovieException { double result = 0 ; // 普通片 if (movieCode == Movie.REGULAR) // 單價為2 { result = 2 ; // 如果租賃天數大于2則,則優惠 if (days > 2 ) { result += (days - 2 ) * 1.5 ; } // 返回總價 return result; } // 最新發布片 else if (movieCode == Movie.NEW_RELEASE) { // 新片沒有優惠,單價為3 return days * 3 ; } // 兒童片 else if (movieCode == Movie.CHILDREN) { // 影片單價 result = 1.5 ; // 如果租賃時間大于3天則做價格優惠 if (days > 3 ) { result += (days - 3 ) * 1.5 ; } // 返回租賃影片總價 return result; } else throw new MovieException( ' 影片不存在 ' ); } /** * 獲取租賃影片積分 * * @param movieCode * 影片類型 * @param days * 租憑天數 * @return 租賃影片積分 * @throws MovieException * 沒有影片類型拋出異常 */ public double getIntegral( int movieCode, int days) throws MovieException { // 普通片 if (movieCode == Movie.REGULAR) return days * 2 ; // 最新發布片 else if (movieCode == Movie.NEW_RELEASE) return days * 3 ; // 兒童片 else if (movieCode == Movie.CHILDREN) return days * 1.5 ; else throw new MovieException( ' 影片不存在 ' ); }}

OK ,我們看一下,現在的 Movie 完全符合租賃需求,通過 getIntegral(int movieCode,int days) 和 getCharge(int movieCode,int days) 來獲得租賃積分及租賃價格。從開閉原則角度來看,如果要添加新的影片類型,我們必須修改 getIntegral(int movieCode,int days) 和 getCharge(int movieCode,int days) 這兩個方法。而若要改變租賃價格、積分的優惠規則時,仍需要修改 getIntegral(int movieCode,int days) 和 getCharge(int movieCode,int days) 方法。現在看來,只有三種影片類型,維護還較方便。而當影片類型較多時,例如 10 種, 100 種影片類型,這樣就是不可以想像的維護。

現在我們來看一下,使用 state pattern 來代替 if else 。先來個類圖。

Java如何利用狀態模式(state pattern)替代if else

首先我們建立一個 abstract class Price 做為影片類型的基類,基類中含有兩個 abstract 方法,獲取總價格 getCharge(int days), 獲取總積分 getIntegral(int days) 方法 , 繼承 abstract classPrice 的三個影片類型兒童片 class ChilerenPrice, 普通片 class RegularPrice, 最新片 class NewReleasePrice 。分別實現 getCharge(int days),getIntegral(int days) 方法,實現方法寫入計算價格的優惠方案及積分的方案。當需要修改方案時,我們只需在某個影片類的方法中對應修改就可以。若新增一個影片分類時,我們只需新增一個實現類實現 abstract class Price 類就 OK 。

class Movie 代表影片,其關聯一個 Price 類,而 setPrice(String movieClass) 方法類似于一個工廠類,傳入 movieClass 為包名類名,用 java 反射機制實例化一個具體傳入 movieClass 的影片類型實現類,這樣我們通過這幾行代碼就可以獲得該影片類型的價格和積分。

Movie regularMovie = new Movie();regularMovie.setPrice(Movie.REGULAR);System.out.println( ' 普通影片租賃10天的價格 ' + regularMovie.getPrice().getCharge( 10 ));System.out.println( ' 普通影片租賃10天的積分 ' + regularMovie.getPrice().getIntegral( 10 ));

下面我們給出詳細代碼

abstract class Price價格基類

package com.qujingbo.movie;/** * <p/> Title: * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 15:48:22 * </p> * * @author EOMS 曲靜波 * @version 1.0 */public abstract class Price { /** * 獲取租賃影片價格需實現該此方法 * * @param days * 租賃天數 * @return 返回影片價格 */ public abstract double getCharge(int days); /** * 獲取租賃影片積分需實現此方法 * * @param days * 租賃天數 * @return 返回影片積分 */ public abstract double getIntegral(int days);}

兒童片ChildrenPrice類,實現abstract class Price ,實現兒童片租賃總價getCharge(int days)及兒童片租賃積分getIntegral(int days)。

package com.qujingbo.movie;/** * <p/> Title:兒童片租賃積分、價格實現 * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 15:49:04 * </p> * * @author EOMS 曲靜波 * @version 1.0 */public class ChildrenPrice extends Price { /** * 兒童片返回租賃積分,兒童片積分規則為: 根據 */ public double getIntegral(int days) { // 返回租賃影片積分 return days * 1.5; } /** * 兒童片返回租賃價格 */ public double getCharge(int days) { // 影片單價 double result = 1.5; // 如果租賃時間大于3天則做價格優惠 if (days > 3) { result += (days - 3) * 1.5; } // 返回租賃影片總價 return result; }}

普通片RegularlPrice類,實現abstract class Price ,實現普通片租賃總價getCharge(int days)及普通片租賃積分getIntegral(int days)。

package com.qujingbo.movie;/** * <p/> Title:普通片租賃積分、價格實現 * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 15:50:10 * </p> * * @author EOMS 曲靜波 * @version 1.0 */public class RegularlPrice extends Price { /** * 普通片返回租賃積分,普通片積分規則 */ public double getIntegral(int days) { // 返回租賃影片積分 return days * 2; } /** * 普通片返回租賃價格 */ public double getCharge(int days) { // 單價為2 double result = 2; // 如果租賃天數大于2則,則優惠 if (days > 2) { result += (days - 2) * 1.5; } // 返回總價 return result; }}

最新發布片NewReleasePrice類,實現abstract class Price ,實現最新發布片租賃總價getCharge(int days)及最新發布片租賃積分getIntegral(int days)。

package com.qujingbo.movie;/** * <p/> Title:最新發布片租賃積分、價格實現 * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 15:48:51 * </p> * * @author EOMS 曲靜波 * @version 1.0 */public class NewReleasePrice extends Price { /** * 最新發布片返回租賃積分,最新發布片積分規則 */ public double getIntegral(int days) { // 返回租賃影片積分 return days * 3; } /** * 最新發布片返回租賃價格 */ public double getCharge(int days) { // 新片沒有優惠,單價為3 return days * 3; }}

電影Movie類,setPrice(String movieClass)(工廠)方法,通過java反射機制實現movieClass(包名,類名)類。若沒有movieClass這個類,則拋出MovieException異常。

package com.qujingbo.movie;/** * <p/> Title:影片類 * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 15:47:55 * </p> * * @author EOMS 曲靜波 * @version 1.0 */public class Movie { // 普通片標識 public static String REGULAR = 'com.qujingbo.movie.RegularlPrice'; // 新片標識 public static String NEW_RELEASE = 'com.qujingbo.movie.NewReleasePrice'; // 兒童片標識 public static String CHILDREN = 'com.qujingbo.movie.ChildrenPrice'; private Price price; public Price getPrice() { return price; } /** * 確定返回具體某個影片類型的實現類,有點像工廠 * * @param movieCode * 影片類型 * @throws MovieException * 若無影片類型則拋異常。 */ public void setPrice(String movieClass) throws MovieException { try { Class cls = Class.forName(movieClass); this.price = (Price) cls.newInstance(); } catch (Exception e) { throw new MovieException('影片不存在'); } }}

給出MovieException源碼。

package com.qujingbo.movie;/** * <p/> Title:自定義異常 * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 19:21:08 * </p> * * @author EOMS 曲靜波 * @version 1.0 */public class MovieException extends Exception { public MovieException(String msg) { super(msg); }}

下面模訪一個顧客租賃影片。

package com.qujingbo.movie;/** * <p/> Title: * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 19:26:23 * </p> * * @author EOMS 曲靜波 * @version 1.0 */public class Customer { /** * 消費(測試程序) * * @throws MovieException * 若沒有影片,拋出異常 */ public void consume() throws MovieException { // 普通電影 Movie regularMovie = new Movie(); regularMovie.setPrice(Movie.REGULAR); // 最新發布電影 Movie newReleaseMovie = new Movie(); newReleaseMovie.setPrice(Movie.NEW_RELEASE); // 兒童電影 Movie childrenMovie = new Movie(); childrenMovie.setPrice(Movie.CHILDREN); System.out.println('普通影片租賃10天的價格' + regularMovie.getPrice().getCharge(10)); System.out.println('最新影片租賃10天的價格' + newReleaseMovie.getPrice().getCharge(10)); System.out.println('兒童影片租賃10天的價格' + childrenMovie.getPrice().getCharge(10)); System.out.println('普通影片租賃10天的積分' + regularMovie.getPrice().getIntegral(10)); System.out.println('最新影片租賃10天的積分' + newReleaseMovie.getPrice().getIntegral(10)); System.out.println('兒童影片租賃10天的積分' + childrenMovie.getPrice().getIntegral(10)); }}

寫一 junit 測試類運行 class Customer 的 consume() 方法。

package com.qujingbo.movie; import junit.framework.TestCase; /** * <p/> Title:junit測試類 * </p> * <p/> Description: * </p> * <p/> Date:2006-10-14 19:32:57 * </p> * * @author EOMS 曲靜波 * @version 1.0 */ public class CustomerTest extends TestCase { private Customer customer = null ; protected void setUp() throws Exception { super .setUp(); customer = new Customer(); } protected void tearDown() throws Exception { super .tearDown(); } /* * Test method for ’com.qujingbo.movie.Customer.consume()’ */ public void testConsume() { try { customer.consume(); } catch (MovieException e) { System.out.println( ' 沒有該類影片 ' ); } }}

OK 。結果為:

普通影片租賃 10 天的價格 14.0

最新影片租賃 10 天的價格 30.0

兒童影片租賃 10 天的價格 12.0

普通影片租賃 10 天的積分 20.0

最新影片租賃 10 天的積分 30.0

兒童影片租賃 10 天的積分 15.0

最后我要說,我們用 OO 表示的租賃過程并不完整,因為顧客不一定只租賃一部影片,而要租賃多部影片,這樣我們缺少一個 Rental (租賃類)。而只是為說明 state pattern 替代 if else ,所以我們沒有添加 Rental (租賃類),若需要參考,請查閱《重構》第一章。 點擊下載源碼.

到此這篇關于Java如何利用狀態模式(state pattern)替代if else的文章就介紹到這了,更多相關Java用狀態模式(state pattern)替代if else內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产探花一区| 麻豆精品蜜桃视频网站| 成人午夜国产| 国产一区二区三区黄网站| 国产精品片aa在线观看| 久久永久免费| 亚洲综合婷婷| 国产日韩1区| 精品国产美女a久久9999| 丝袜av一区| 久久久国产精品入口麻豆 | 久久精品91| 日韩av首页| 五月天久久网站| 国产精品免费精品自在线观看| 97精品在线| 国产精品免费看| 亚洲综合日韩| 国产精品亲子伦av一区二区三区| 欧美影院精品| 日本va欧美va欧美va精品| 国产亚洲精品美女久久久久久久久久| 国产亚洲久久| 国产aⅴ精品一区二区四区| 国产一区二区三区久久| 国产欧美在线| 久久精品影视| 美女毛片一区二区三区四区| 欧美日韩精品一区二区视频| 中文亚洲免费| 日韩中文字幕一区二区高清99| 日韩高清在线观看一区二区| 国产精品色婷婷在线观看| 欧美国产三级| 国产色播av在线| 美女网站视频一区| 在线午夜精品| 日韩av在线播放中文字幕| 国产精品777777在线播放 | 国产日韩欧美中文在线| 久久不卡日韩美女| 在线观看精品| 日韩视频在线一区二区三区 | 国产精品视频首页| 亚洲综合在线电影| 最新亚洲一区| 青青在线精品| 日韩大片在线| 久久亚洲精品伦理| 亚洲日本免费电影| 久久精品二区亚洲w码 | 久久国产精品成人免费观看的软件| 午夜亚洲福利在线老司机| 亚州av一区| 黄色精品视频| 免费日韩av| 欧美成人一二区| 在线成人动漫av| 国产日产一区| 欧美精品一区二区三区精品| 欧美一区成人| 日本欧美不卡| 综合亚洲色图| 国产suv精品一区二区四区视频| 日韩一级欧洲| 麻豆久久久久久| 亚洲国产不卡| 国产精品久久久久9999高清| 日韩精品免费一区二区在线观看| 亚洲深深色噜噜狠狠爱网站| 国产中文字幕一区二区三区| 噜噜噜久久亚洲精品国产品小说| 久久99久久人婷婷精品综合| 一本色道精品久久一区二区三区| 久久国产尿小便嘘嘘| 久久精品1区| 日韩国产欧美在线播放| 超级白嫩亚洲国产第一| 蜜桃一区二区三区在线观看| 欧美xxxx中国| 日韩影片在线观看| 久久久久久久久丰满| 日本欧美在线| 亚洲激情精品| 美腿丝袜亚洲一区| 蜜臀va亚洲va欧美va天堂| 成人av三级| 日本少妇一区二区| 亚洲精品成人| av资源中文在线| 欧美在线看片| 欧美日韩国产传媒| 久久中文精品| 亚洲精品影院在线观看| 久久久久蜜桃| 国产精品亲子伦av一区二区三区 | 国产粉嫩在线观看| 欧美欧美黄在线二区| 在线亚洲欧美| 色老板在线视频一区二区| 欧美精品第一区| 日韩专区欧美专区| 黄色aa久久| 久久不见久久见免费视频7 | 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 99免费精品| 国产一区二区精品福利地址| 亚洲色图国产| 99久久九九| 国产不卡精品在线| 鲁大师精品99久久久| 日韩精品免费视频人成| 99国产精品久久久久久久| 国产精品日韩| 免费黄色成人| 日韩在线免费| 国产成人精品免费视| 国产精品任我爽爆在线播放| 日韩高清三区| 日韩手机在线| 视频一区在线播放| 在线综合视频| 欧美日韩国产高清电影| 精品三级av| 欧美激情五月| 国产精品资源| 欧美一区在线观看视频| 91精品一区| 欧美亚洲专区| 欧美一区网站| 欧美亚洲tv| 欧美久久久网站| 日韩精彩视频在线观看| 午夜天堂精品久久久久| 美国欧美日韩国产在线播放| 亚洲一区国产一区| 亚洲作爱视频| 丝袜美腿高跟呻吟高潮一区| 日韩欧美少妇| 成人小电影网站| 黑人精品一区| 日韩激情一区二区| 欧美一级二级三级视频| 国产调教精品| 国产精品99精品一区二区三区∴| 国产精品啊v在线| 国产劲爆久久| 国产中文欧美日韩在线| 91麻豆国产自产在线观看亚洲| 日本一区二区免费高清| 成人精品久久| 久久国产精品成人免费观看的软件| 久久影视一区| 欧美日一区二区| 午夜欧美精品| 蜜芽一区二区三区| 日本精品一区二区三区在线观看视频| 91国内精品| 欧美国产日韩电影| 福利在线一区| 99久久夜色精品国产亚洲狼 | 精品日韩一区| 欧美aa在线观看| jiujiure精品视频播放| 亚洲欧美网站| 欧美精品影院| 国产精品**亚洲精品| 精品一区二区三区四区五区| yellow在线观看网址| 99久久久久国产精品| 视频一区免费在线观看| 亚洲精一区二区三区| 欧美日韩亚洲国产精品| 国产一区二区三区成人欧美日韩在线观看| 欧美二三四区| 国产亚洲一区在线| 欧美专区一区| 日韩久久精品网| 91精品高清| 日韩和欧美一区二区| 国内精品麻豆美女在线播放视频| 亚洲一级少妇| 国产精品88久久久久久| 日韩高清一级| 美女精品视频在线| 日韩在线欧美| 西西人体一区二区| 欧美a一区二区| 亚洲手机在线| 青青国产91久久久久久| 久久免费国产| 国产日产一区| 91精品福利| 精品一区视频| 免费日韩视频| 激情黄产视频在线免费观看| 亚洲深深色噜噜狠狠爱网站| 国产精品久久国产愉拍| 免费视频亚洲| 久久精品欧洲|