电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

java設計模式之State

瀏覽:79日期:2024-06-27 11:00:29
內容: State的定義: 不同的狀態(tài),不同的行為;或者說,每個狀態(tài)有著相應的行為.何時使用?State模式在實際使用中比較多,適合'狀態(tài)的切換'.因為我們經(jīng)常會使用If elseif else 進行狀態(tài)切換, 如果針對狀態(tài)的這樣判斷切換反復出現(xiàn),我們就要聯(lián)想到是否可以采取State模式了.不只是根據(jù)狀態(tài),也有根據(jù)屬性.如果某個對象的屬性不同,對象的行為就不一樣,這點在數(shù)據(jù)庫系統(tǒng)中出現(xiàn)頻率比較高,我們經(jīng)常會在一個數(shù)據(jù)表的尾部,加上property屬性含義的字段,用以標識記錄中一些特殊性質的記錄,這種屬性的改變(切換)又是隨時可能發(fā)生的,就有可能要使用State.是否使用?在實際使用,類似開關一樣的狀態(tài)切換是很多的,但有時并不是那么明顯,取決于你的經(jīng)驗和對系統(tǒng)的理解深度.這里要闡述的是'開關切換狀態(tài)' 和' 一般的狀態(tài)判斷'是有一些區(qū)別的, ' 一般的狀態(tài)判斷'也是有 if..elseif結構,例如:if (which==1) state='hello';else if (which==2) state='hi';else if (which==3) state='bye';這是一個 ' 一般的狀態(tài)判斷',state值的不同是根據(jù)which變量來決定的,which和state沒有關系.如果改成:if (state.euqals('bye')) state='hello';else if (state.euqals('hello')) state='hi';else if (state.euqals('hi')) state='bye';這就是 '開關切換狀態(tài)',是將state的狀態(tài)從'hello'切換到'hi',再切換到''bye';在切換到'hello',好象一個旋轉開關,這種狀態(tài)改變就可以使用State模式了.如果單純有上面一種將'hello''hi''bye''hello'這一個方向切換,也不一定需要使用State模式,因為State模式會建立很多子類,復雜化,但是如果又發(fā)生另外一個行為:將上面的切換方向反過來切換,或者需要任意切換,就需要State了.請看下例:public class Context{private Color state=null;public void push(){//如果當前red狀態(tài) 就切換到blueif (state==Color.red) state=Color.blue;//如果當前blue狀態(tài) 就切換到greenelse if (state==Color.blue) state=Color.green;//如果當前black狀態(tài) 就切換到redelse if (state==Color.black) state=Color.red;//如果當前green狀態(tài) 就切換到blackelse if (state==Color.green) state=Color.black;Sample sample=new Sample(state);sample.operate();}public void pull(){//與push狀態(tài)切換正好相反if (state==Color.green) state=Color.blue;else if (state==Color.black) state=Color.green;else if (state==Color.blue) state=Color.red;else if (state==Color.red) state=Color.black;Sample2 sample2=new Sample2(state);sample2.operate(); }} 在上例中,我們有兩個動作push推和pull拉,這兩個開關動作,改變了Context顏色,至此,我們就需要使用State模式優(yōu)化它.另外注意:但就上例,state的變化,只是簡單的顏色賦值,這個具體行為是很簡單的,State適合巨大的具體行為,因此在,就本例,實際使用中也不一定非要使用State模式,這會增加子類的數(shù)目,簡單的變復雜.例如: 銀行帳戶, 經(jīng)常會在Open 狀態(tài)和Close狀態(tài)間轉換.例如: 經(jīng)典的TcpConnection, Tcp的狀態(tài)有創(chuàng)建 偵聽 關閉三個,并且反復轉換,其創(chuàng)建 偵聽 關閉的具體行為不是簡單一兩句就能完成的,適合使用State例如:信箱POP帳號, 會有四種狀態(tài), start HaveUsername Authorized quit,每個狀態(tài)對應的行為應該是比較大的.適合使用State例如:在工具箱挑選不同工具,可以看成在不同工具中切換,適合使用State.如 具體繪圖程序,用戶可以選擇不同工具繪制方框 直線 曲線,這種狀態(tài)切換可以使用State.如何使用State需要兩種類型實體參與:1.state manager 狀態(tài)管理器 ,就是開關 ,如上面例子的Context實際就是一個state manager, 在state manager中有對狀態(tài)的切換動作.2.用抽象類或接口實現(xiàn)的父類,,不同狀態(tài)就是繼承這個父類的不同子類.以上面的Context為例.我們要修改它,建立兩個類型的實體.第一步: 首先建立一個父類:public abstract class State{public abstract void handlepush(Context c);public abstract void handlepull(Context c);public abstract void getcolor();} 父類中的方法要對應state manager中的開關行為,在state manager中 本例就是Context中,有兩個開關動作push推和pull拉.那么在狀態(tài)父類中就要有具體處理這兩個動作:handlepush() handlepull(); 同時還需要一個獲取push或pull結果的方法getcolor()下面是具體子類的實現(xiàn):public class BlueState extends State{public void handlepush(Context c){ //根據(jù)push方法'如果是blue狀態(tài)的切換到green' ; c.setState(new GreenState());}public void handlepull(Context c){ //根據(jù)pull方法'如果是blue狀態(tài)的切換到red' ;c.setState(new RedState());}public abstract void getcolor(){ return (Color.blue)}} 同樣 其他狀態(tài)的子類實現(xiàn)如blue一樣.第二步: 要重新改寫State manager 也就是本例的Context:public class Context{private Sate state=null; //我們將原來的 Color state 改成了新建的State state;//setState是用來改變state的狀態(tài) 使用setState實現(xiàn)狀態(tài)的切換pulic void setState(State state){this.state=state;}public void push(){//狀態(tài)的切換的細節(jié)部分,在本例中是顏色的變化,已經(jīng)封裝在子類的handlepush中實現(xiàn),這里無需關心state.handlepush(this);//因為sample要使用state中的一個切換結果,使用getColor()Sample sample=new Sample(state.getColor());sample.operate(); } public void pull(){state.handlepull(this);Sample2 sample2=new Sample2(state.getColor());sample2.operate(); }} 至此,我們也就實現(xiàn)了State的refactorying過程.以上只是相當簡單的一個實例,在實際應用中,handlepush或handelpull的處理是復雜的.參考資源:the State and StategyHow to implement state-dependent behavior The state patterns Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標簽: Java
相關文章:
主站蜘蛛池模板: 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 合肥白癜风医院_[治疗白癜风]哪家好_合肥北大白癜风医院 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 高温高压釜(氢化反应釜)百科 | 液压中心架,数控中心架,自定心中心架-烟台恒阳机电设计有限公司 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 主题班会网 - 安全教育主题班会,各类主题班会PPT模板 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 双菱电缆-广州电缆厂_广州电缆厂有限公司 | 福建珂朗雅装饰材料有限公司「官方网站」| 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 锯边机,自动锯边机,双面涂胶机-建业顺达机械有限公司 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 滚筒线,链板线,总装线,流水线-上海体能机电有限公司 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | nalgene洗瓶,nalgene量筒,nalgene窄口瓶,nalgene放水口大瓶,浙江省nalgene代理-杭州雷琪实验器材有限公司 | 哔咔漫画网页版在线_下载入口访问指引 | 透平油真空滤油机-变压器油板框滤油机-滤油车-华之源过滤设备 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 智慧物联网行业一站式解决方案提供商-北京东成基业 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 博客-悦享汽车品质生活| 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 东莞注册公司-代办营业执照-东莞公司注册代理记账-极刻财税 | 高柔性拖链电缆_卷筒电缆_耐磨耐折聚氨酯电缆-玖泰特种电缆 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 |