小A:“講了那麼多,師兄如果能給我舉個例子那就更好了。”
大B:“那我給你舉個聖鬥士星矢的狀態模式和觀察者模式的例子吧!”
星矢:動畫片《聖鬥士星矢》的男豬蹄,超級小強,怎麼打也打不死。
雅典娜:動畫片《聖鬥士星矢》的女豬蹄,自稱女神,手下有88個男人為他賣命。
狀態模式:為了方便的控製狀態的變化,避免一堆IF/ELSE,以及狀態規則改變的時避免代碼改動的混亂。
觀察者模式:一個被觀察者一動,多個觀察者跟著動,經常用於界麵UI。
話說星矢和很強的某鬥士甲對打,雅典娜在一邊看,星矢總是挨揍,每次挨揍完之後星矢的狀態總是會發生一些變化:
正常——挨打——瀕死——挨打——小宇宙爆發——挨打——瀕死——挨打——女神護體——挨打(星矢無敵了,打也沒用,戰鬥結束)——正常
以上狀態轉變用狀態模式來表現,一個Saiya類代表星矢,一個SaiyaState代表他的狀態,SaiyaState下麵有多個子類,分別代表星矢的多種狀態,如正常NORMAL、瀕死DYING、小宇宙爆發UNIVERSE、女神護體GODDESS,即把狀態抽象成對象,在每種狀態裏麵實現被打的時候所需要更改的狀態,這樣就避免了每次被打都要進行一次IF/ELSE的判斷。
Java代碼
//定義星矢的四種狀態
//調用當前狀態的被打方法?反過來改變自己的狀態
//當前狀態名
//觀察者模式
notifyObservers(“星矢狀態變化”);
//定義星矢的四種狀態
//調用當前狀態的被打方法反過來改變自己的狀態
//當前狀態名
//觀察者模式
notifyObservers(“星矢狀態變化”);
星矢的狀態
Java代碼
//星矢被打了
//星矢被打了
在每種狀態裏麵實現被打的時候所需要更改的狀態,例如小宇宙爆發狀態下被打Java代碼
/*小宇宙爆發狀態被打進入瀕死狀態
/*小宇宙爆發狀態被打進入瀕死狀態
雅典娜在一邊看,星矢每次被打她都要給星矢加油,她是個觀察者,星矢是被觀察者,這裏星矢實現,每次被打hit就notifyObservers,雅典娜就加油。
Java代碼
/*我是雅典娜我是觀察者
(“雅典娜說:星矢加油啊!”);
/*我是雅典娜我是觀察者
總的來看這個過程就是這樣子:
Java代碼
(本章完)