成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

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

OK ,現(xiàn)在我們使用 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 { // 普通片標(biāo)識 public static int REGULAR = 1 ; // 新片標(biāo)識 public static int NEW_RELEASE = 2 ; // 兒童片標(biāo)識 public static int CHILDREN = 3 ; /** * 獲取租賃影片總價 * * @param movieCode * 影片類型 * @param days * 租憑天數(shù) * @return 租賃影片總價 * @throws MovieException * 沒有影片類型拋出異常 */ public double getCharge( int movieCode, int days) throws MovieException { double result = 0 ; // 普通片 if (movieCode == Movie.REGULAR) // 單價為2 { result = 2 ; // 如果租賃天數(shù)大于2則,則優(yōu)惠 if (days > 2 ) { result += (days - 2 ) * 1.5 ; } // 返回總價 return result; } // 最新發(fā)布片 else if (movieCode == Movie.NEW_RELEASE) { // 新片沒有優(yōu)惠,單價為3 return days * 3 ; } // 兒童片 else if (movieCode == Movie.CHILDREN) { // 影片單價 result = 1.5 ; // 如果租賃時間大于3天則做價格優(yōu)惠 if (days > 3 ) { result += (days - 3 ) * 1.5 ; } // 返回租賃影片總價 return result; } else throw new MovieException( ' 影片不存在 ' ); } /** * 獲取租賃影片積分 * * @param movieCode * 影片類型 * @param days * 租憑天數(shù) * @return 租賃影片積分 * @throws MovieException * 沒有影片類型拋出異常 */ public double getIntegral( int movieCode, int days) throws MovieException { // 普通片 if (movieCode == Movie.REGULAR) return days * 2 ; // 最新發(fā)布片 else if (movieCode == Movie.NEW_RELEASE) return days * 3 ; // 兒童片 else if (movieCode == Movie.CHILDREN) return days * 1.5 ; else throw new MovieException( ' 影片不存在 ' ); }}

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

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

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

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

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

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

下面我們給出詳細(xì)代碼

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 { /** * 獲取租賃影片價格需實現(xiàn)該此方法 * * @param days * 租賃天數(shù) * @return 返回影片價格 */ public abstract double getCharge(int days); /** * 獲取租賃影片積分需實現(xiàn)此方法 * * @param days * 租賃天數(shù) * @return 返回影片積分 */ public abstract double getIntegral(int days);}

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

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

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

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

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

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

電影Movie類,setPrice(String movieClass)(工廠)方法,通過java反射機制實現(xiàn)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 { // 普通片標(biāo)識 public static String REGULAR = 'com.qujingbo.movie.RegularlPrice'; // 新片標(biāo)識 public static String NEW_RELEASE = 'com.qujingbo.movie.NewReleasePrice'; // 兒童片標(biāo)識 public static String CHILDREN = 'com.qujingbo.movie.ChildrenPrice'; private Price price; public Price getPrice() { return price; } /** * 確定返回具體某個影片類型的實現(xiàn)類,有點像工廠 * * @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); // 最新發(fā)布電影 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 。結(jié)果為:

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

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

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

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

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

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

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

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

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日本不卡视频在线| 精品福利一区二区三区| 欧美zozo另类异族| 久久丁香综合五月国产三级网站 | 免费日韩伦理电影| 亚洲一区3d动漫同人无遮挡| 亚洲欧美二区三区| 亚洲精华国产欧美| 亚洲精品免费播放| 国产一区导航| 丝袜美腿高跟呻吟高潮一区| 久久久久久久久久久一区| 亚洲国产精品久久不卡毛片| 亚洲一级在线| 日日摸夜夜添夜夜添精品视频| 国产女优一区| 亚洲国产精品久久人人爱| 国产精品一区二区欧美| 亚洲国产精品人人做人人爽| 亚洲在线国产日韩欧美| 亚洲午夜电影在线观看| 久久午夜激情| 六月丁香综合在线视频| 在线播放一区二区三区| 国产高清精品久久久久| 欧美电视剧在线看免费| a级精品国产片在线观看| 久久一日本道色综合| 91蜜桃网址入口| 亚洲欧美在线观看| 99热这里只有成人精品国产| 亚洲黄色免费电影| 久久久久久久欧美精品| 精品一区免费av| 91精品福利在线一区二区三区 | 久久综合丝袜日本网| 成人激情开心网| 欧美精彩视频一区二区三区| 亚洲一本视频| 亚洲国产精品一区二区www在线| 在线观看91视频| 成人国产精品免费观看动漫| 久久久精品tv| 亚洲激情av| 日韩av中文在线观看| 777久久久精品| 欧美一区综合| 亚洲精品ww久久久久久p站| 久久一二三四| 国产精品一二三四五| 久久婷婷成人综合色| 韩国亚洲精品| 日日夜夜精品免费视频| 91精品久久久久久久91蜜桃| 97国产精品videossex| 综合在线观看色| 一本到不卡免费一区二区| 国产综合久久久久久久久久久久| 精品国产制服丝袜高跟| 黑人一区二区三区四区五区| 午夜一区二区三区视频| 在线电影国产精品| 亚洲欧美一区二区原创| 亚洲高清中文字幕| 欧美三级午夜理伦三级中视频| 99热国产精品| 亚洲一区二区三区四区在线| 在线播放/欧美激情| 欧美午夜免费| 欧美a级一区二区| 精品国产不卡一区二区三区| 一区二区91| 国产在线精品一区在线观看麻豆| 久久蜜桃av一区精品变态类天堂 | 老妇喷水一区二区三区| 国产91精品久久久久久久网曝门| 中文字幕在线一区| 欧美艳星brazzers| 欧美日本精品| 美女一区二区久久| 中文字幕成人在线观看| 久久精选视频| eeuss影院一区二区三区| 一区二区三区欧美在线观看| 欧美一区二区视频在线观看2020 | 欧美日韩一区综合| 免费观看成人av| 欧美国产一区二区| 在线观看91视频| 欧美日韩在线精品| 久久99日本精品| 1区2区3区精品视频| 欧美日韩国产另类不卡| 狠狠色综合网| 国产麻豆一精品一av一免费| 亚洲欧美激情插| 日韩欧美国产三级| 香蕉免费一区二区三区在线观看| 99国产精品久久久久| 蜜桃免费网站一区二区三区| 国产精品动漫网站| 日韩视频免费观看高清完整版在线观看| 亚洲精品视频一区二区三区| 国产99久久久国产精品潘金网站| 亚洲综合视频在线| 久久午夜羞羞影院免费观看| 在线观看中文字幕不卡| 好看的av在线不卡观看| 国产精品456露脸| 亚洲成人午夜影院| 国产亚洲欧美激情| 欧美精品久久久久久久多人混战| 91久久午夜| 99国产一区二区三精品乱码| 看国产成人h片视频| 亚洲免费观看高清完整版在线| 日韩视频一区在线观看| 久久精品国产清高在天天线 | 麻豆91在线播放| 一个色妞综合视频在线观看| 久久久国产精品不卡| 欧美三级三级三级| 国产精品欧美日韩一区| 欧美成人在线免费观看| 国产麻豆日韩欧美久久| 婷婷成人激情在线网| 亚洲人成网站在线| 欧美激情一区二区三区全黄| 制服.丝袜.亚洲.另类.中文| 久久久夜夜夜| 国产欧美精品久久| 欧美天堂亚洲电影院在线观看| 成人性生交大片免费看中文| 久久99精品国产.久久久久久| 亚洲成av人片一区二区梦乃| 亚洲手机成人高清视频| 久久久亚洲午夜电影| 欧美高清视频www夜色资源网| 亚洲专区免费| 亚洲激情社区| 国产精品jizz在线观看美国| av综合在线播放| 丁香婷婷综合网| 黄页视频在线91| 奇米综合一区二区三区精品视频| 亚洲成人在线观看视频| 一区二区三区产品免费精品久久75| 国产精品青草综合久久久久99| 亚洲精品在线一区二区| 欧美精品视频www在线观看| 91搞黄在线观看| 麻豆成人在线| 国产精品久久久久毛片大屁完整版| 影院欧美亚洲| 国内外成人免费视频| 99免费精品视频| www.爱久久.com| 成人激情小说网站| 懂色av中文字幕一区二区三区| 国产精品一线二线三线| 黄色日韩网站视频| 国产在线国偷精品免费看| 国模娜娜一区二区三区| 国内精品在线播放| 国模冰冰炮一区二区| 国产原创一区二区三区| 国产精品一二三在| 国产成人午夜视频| 高清免费成人av| av一区二区三区四区| av综合在线播放| 欧美一区激情| 欧美日韩妖精视频| 欧美三区不卡| 亚洲高清视频一区二区| 亚洲无毛电影| 国产日韩精品视频一区二区三区| 99国产精品久久久久久久| 99热在线精品观看| 亚洲一区免费| 久久一区亚洲| 欧美午夜精品一区| 这里只有精品免费| 精品乱人伦小说| 久久久久久亚洲综合影院红桃| 欧美国产亚洲另类动漫| 亚洲欧洲综合另类| 午夜精品免费在线观看| 美女在线视频一区| 国产成人夜色高潮福利影视| 成人激情小说乱人伦| 欧美欧美全黄| 一区二区精品在线观看| 久久久久久9| 欧美理论电影在线| 精品99999| 成人欧美一区二区三区在线播放| 亚洲综合视频网| 日韩二区三区四区| 国产真实乱对白精彩久久|