第70章(1 / 1)

小A:“講了那麼多,師兄如果能給我舉個例子那就更好了。”

大B:“那我給你舉個聖鬥士星矢的狀態模式和觀察者模式的例子吧!”

星矢:動畫片《聖鬥士星矢》的男豬蹄,超級小強,怎麼打也打不死。

雅典娜:動畫片《聖鬥士星矢》的女豬蹄,自稱女神,手下有88個男人為他賣命。

狀態模式:為了方便的控製狀態的變化,避免一堆IF/ELSE,以及狀態規則改變的時避免代碼改動的混亂。

觀察者模式:一個被觀察者一動,多個觀察者跟著動,經常用於界麵UI。

話說星矢和很強的某鬥士甲對打,雅典娜在一邊看,星矢總是挨揍,每次挨揍完之後星矢的狀態總是會發生一些變化:

正常——挨打——瀕死——挨打——小宇宙爆發——挨打——瀕死——挨打——女神護體——挨打(星矢無敵了,打也沒用,戰鬥結束)——正常

以上狀態轉變用狀態模式來表現,一個Saiya類代表星矢,一個SaiyaState代表他的狀態,SaiyaState下麵有多個子類,分別代表星矢的多種狀態,如正常NORMAL、瀕死DYING、小宇宙爆發UNIVERSE、女神護體GODDESS,即把狀態抽象成對象,在每種狀態裏麵實現被打的時候所需要更改的狀態,這樣就避免了每次被打都要進行一次IF/ELSE的判斷。

Java代碼

//定義星矢的四種狀態

//調用當前狀態的被打方法?反過來改變自己的狀態

//當前狀態名

//觀察者模式

notifyObservers(“星矢狀態變化”);

//定義星矢的四種狀態

//調用當前狀態的被打方法反過來改變自己的狀態

//當前狀態名

//觀察者模式

notifyObservers(“星矢狀態變化”);

星矢的狀態

Java代碼

//星矢被打了

//星矢被打了

在每種狀態裏麵實現被打的時候所需要更改的狀態,例如小宇宙爆發狀態下被打Java代碼

/*小宇宙爆發狀態被打進入瀕死狀態

/*小宇宙爆發狀態被打進入瀕死狀態

雅典娜在一邊看,星矢每次被打她都要給星矢加油,她是個觀察者,星矢是被觀察者,這裏星矢實現,每次被打hit就notifyObservers,雅典娜就加油。

Java代碼

/*我是雅典娜我是觀察者

(“雅典娜說:星矢加油啊!”);

/*我是雅典娜我是觀察者

總的來看這個過程就是這樣子:

Java代碼

(本章完)