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

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

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

瀏覽:94日期: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久久,三上悠亚国产精品一区二区三区
日本不卡中文字幕| 日韩三级精品| 免费精品一区| 国产一区日韩欧美| 91亚洲国产成人久久精品| 另类中文字幕国产精品| 伊人久久在线| 免费日韩一区二区| 自拍自偷一区二区三区| 在线精品福利| 久久久精品区| 亚洲精品a级片| 亚洲一级二级| 国产精品成人一区二区网站软件| 国产精品毛片视频| 欧美日韩激情| 国产精品一区二区三区www| 色欧美自拍视频| 在线午夜精品| 久久精品国产精品亚洲毛片| 不卡av一区二区| 国产精品久久久久久久久久妞妞| 不卡一二三区| 国产精品久久久久久av公交车| 91精品一区二区三区综合| 青草综合视频| 一区二区三区四区在线观看国产日韩| 精品中文在线| 国产伦精品一区二区三区视频| 性色av一区二区怡红| 欧美日韩视频网站| 欧美在线日韩| 亚洲aa在线| 黑丝一区二区三区| 国内精品麻豆美女在线播放视频| 综合色就爱涩涩涩综合婷婷| 久久天堂av| 欧美好骚综合网| 欧美日韩亚洲一区二区三区在线| 亚洲视频www| 日韩天堂av| 欧美搞黄网站| 欧美日韩第一| 亚洲国内欧美| 亚洲www啪成人一区二区| 国产美女亚洲精品7777| 成人日韩精品| 国产极品嫩模在线观看91精品| 中文无码久久精品| 亚洲激情偷拍| 成人av二区| 精品91久久久久| 亚洲深夜av| 国产精品三上| 蜜桃久久精品一区二区| 亚州av乱码久久精品蜜桃| 久久精品国产68国产精品亚洲| 大香伊人久久精品一区二区| 精品亚洲a∨一区二区三区18| 久久成人福利| 欧美亚洲日本精品| 日韩精品免费一区二区在线观看| 国产视频一区三区| 国产精品美女久久久久久不卡| 亚洲欧美日韩国产一区| 久久久久午夜电影| 免费的成人av| 三上悠亚国产精品一区二区三区 | 日韩在线观看不卡| 日韩在线短视频| 蜜桃视频一区二区三区在线观看| 伊人精品久久| 久久精品五月| 国产农村妇女精品一区二区| 亚洲精品一二| 麻豆网站免费在线观看| 日本高清久久| 麻豆视频一区二区| 日韩不卡一区二区| 国产精品一区二区美女视频免费看 | 99精品国产一区二区三区| www.com.cn成人| 亚洲欧美日本日韩| 精品色999| 一区二区三区网站| 99国产精品免费视频观看| 国产精品任我爽爆在线播放| 久久天堂av| 日韩国产在线一| 在线天堂中文资源最新版| 免费黄网站欧美| 一区二区三区网站| 亚洲成a人片| 亚洲精品九九| 久久国产日韩| 久久只有精品| 国产欧美日韩精品高清二区综合区 | 免费观看不卡av| 国产精品igao视频网网址不卡日韩 | 激情欧美国产欧美| 91日韩在线| 日韩免费小视频| 在线 亚洲欧美在线综合一区| 国产日韩欧美一区在线| 亚洲欧美日韩国产综合精品二区 | 久久久久久自在自线| 国产va在线视频| 免费国产亚洲视频| 午夜影院欧美| 亚洲成人国产| 精品99久久| 国产亚洲精品精品国产亚洲综合| 丝袜美腿高跟呻吟高潮一区| 播放一区二区| 精品捆绑调教一区二区三区| 精品久久久中文字幕| 国产精品成人自拍| 欧美成人日韩| 高清av一区| 精品国产成人| 极品av在线| 成人一区而且| 日韩视频免费| 麻豆精品蜜桃视频网站| 99久久久久| 亚洲免费福利| 欧美成人日韩| 亚洲精品福利电影| 成人小电影网站| 欧美国产91| 日韩一区二区三区高清在线观看| 国产免费成人| 欧美片第1页综合| 精品国产中文字幕第一页| 久久中文在线| 亚洲无线一线二线三线区别av| 精品99久久| 香蕉成人久久| 视频一区视频二区中文| 免费观看在线色综合| 亚洲欧美视频一区二区三区| 午夜国产一区二区| 日韩高清一级| 久久av日韩| 91一区二区三区四区| 久久婷婷一区| 日韩精品久久久久久久软件91| 久久久久亚洲精品中文字幕| 日韩激情一区| 日韩精品一二区| 久久婷婷国产| 亚洲一区日韩| 国产精品乱战久久久| 久久精品在线| 国产欧美日韩精品一区二区免费 | 免费视频国产一区| 亚洲精品护士| 天堂√中文最新版在线| 伊人久久亚洲| 久久国产日韩| 久久精品理论片| 日韩精选在线| 黄色国产精品| 日本不卡免费高清视频在线| 婷婷精品在线| 亚洲午夜在线| 福利片在线一区二区| 日韩在线网址| 模特精品在线| 亚洲一级少妇| 在线人成日本视频| 欧美aⅴ一区二区三区视频| 免费看日韩精品| 免费看欧美美女黄的网站| 久久久五月天| 国产精品字幕| 伊人久久大香线蕉av不卡| 成人污污视频| 麻豆视频一区二区| 国产精品www.| 精品女同一区二区三区在线观看| 亚洲精品三级| 亚洲乱码视频| 欧美精品黄色| 欧美另类综合| 中文字幕av亚洲精品一部二部 | 久久不射中文字幕| 久久久久久久久久久9不雅视频| 精品免费av| 日韩另类视频| 丝袜美腿高跟呻吟高潮一区| 一区二区精品| 日韩成人一级| 欧美一级二区| 久久精品国产99国产精品| av免费不卡国产观看| 日韩国产一区二区三区| 91精品一区国产高清在线gif | 日韩福利一区| 日韩视频久久|