天天看小說

第139章

小A:“備忘錄模式要怎麼去實現?”

大B:“我詳細給你說。”

1、備忘錄模式中的角色

發起人:創建含有內部狀態的備忘錄對象,並使用備忘錄對象存儲狀態。

負責人:負責人保存備忘錄對象,但不檢查備忘錄對象的內容。

備忘錄:備忘錄對象將發起人對象的內部狀態存起來,並保證其內容不被髮起人對象之外的對象像讀齲

注意:在備忘錄的角色中,定義了他必須對不同的人提供不同的接口,對發起人提供寬接口,對其它任何人提供窄。

接口:也許你說我都提供寬接口了。這也是備忘錄的一種實現,叫做白箱備忘錄,不過這種方法的封裝沒有設計。好,安全性不夠好。

2、白箱備忘錄的實現:

publicclassOriginator{

privateStringstate;

publicMementoCreateMemento(){

returnnewMemento(state);

}

publicvoidrestoreMemento(Mementomemento){

this.state=memento.getState();

}

publicStringgetState(){

returnthis.state;

}

publicvoidsetState(Stringstate){

this.state=state;

System.out.println(“Currentstate=”+this.state);

}

}

publicclassMemento{

privateStringstate;

publicMemento(Stringstate){

this.state=state;

}

publicStringgetState(){

returnthis.state;

}

publicvoidsetState(){

this.state=state;

}

}

publicclassCaretaker{

privateMementomemento;

publicMementoretrieveMemento(){

returnthis.memento;

}

publicvoidsaveMemento(Mementomemento){

this.memento=memento;

}

}

publicclassClient{

privatestaticOriginatoro=newOriginator();

privatestaticCaretakerc=newCaretaker();

publicstaticvoidmain(Sting[]args){

o.setState(“ON”);

c.saveMemento(o.createMemento());

o.setState(“OFF”);

o.restoreMemento(c.retrieveMemento());

}

}

白箱的優點:實現簡單。

白箱的缺點:上邊說了,破壞了封裝,安全性有些問題。

說明:這裡白箱的實現只保存了一個狀態,其實是可以保存多個狀態的。

3、雙接口的實現,寬窄接口(黑箱)

如何實現寬窄接口呢?內部類也許是個好方法。我們把備忘錄類設計“成發起人”的內部類,但這樣還有的問題是同一package中的其它類也能訪問到,爲了解決這個問題,我們可以把“備忘錄”的方法設計成私有的方法,這樣就可以保證封裝,又保證發起人能訪問到。實現如下:

定義窄接口。

publicinterfaceNarrowMemento{

publicvoidnarrowMethod();

}

classOriginator{

private

Stringstate;

privateNarrowMementomemento;

publicOriginator(){

}

publicNarrowMementocreateMemento(){

memento=newMemento(this.state);

returnmemento;

}

publicvoidrestoreMemento(NarrowMementomemento){

MementoaMemento=(Memento)memento;

this.setState(aMemento.getState());

}

publicStringgetState(){

returnthis.state;

}

publicvoidsetState(Stringstate){

this.state=state;

}

//內部類

protectedclassMementoimplementsNarrowMemento{

privateStringsavedState;

privateMemento(StringsomeState){

saveState=someState;

}

privatevoidsetState(StringsomeState){

saveState=someState;

}

privateStringgetState()

{

returnsaveState;

}

publicvoidnarrowMethod(){

System.out.println(“thisisnarrowmethod”);

}

}

publicNarrowMementogetNarrowMemento(){

returnmemento;

}

}

publicclassCaretaker{

privateNarrowMementomemento;

publicNarrowMementoretrieveMemento(){

returnthis.memento;

}

publicvoidsaveMemento(NarrowMementomemento){

this.memento=memento;

}

}

publicclassClient{

privatestaticOriginatoro=newOriginator();

privatestaticCaretakerc=newCaretaker();

publicstaticvoidmain(String[]args){

//usewideinterface

o.setState(“On”);

c.saveMemento(o.createMemento());

o.setState(“Off”);

o.restoreMemento(c.retrieveMemento());

//usenarrowinterface

NarrowMementomemento=o.getNarrowMemento();

memento.narrowMethod();

}

}

大B:“還要注意的是:1、前邊兩個例子都是記錄了單個狀態(單check點),要實現多個狀態點很容易,只須要把記錄state的字符串換成一個list,然後添加,取得。如果須要隨機須得狀態點,也可以用map來存放。這樣多個check點就實現了。2、一般情況下可以擴展負責人的功能,讓負責人的功能更強大,從而讓客戶端的操做更少些。解放客戶端。3、自述歷史模式,這個就是把發起人,負責人寫在一個類中,平時的應用中這種方法比較常見。”

第122章第204章第4章第20章第13章第95章第36章第97章第140章第156章第72章第25章第116章第178章第219章第90章第144章第170章第66章第227章第142章第1章第1章第1章第131章第205章第55章第22章第156章第89章第116章第184章第212章第96章第9章第220章第49章第124章第177章第92章第86章第173章第4章第189章第206章第213章第221章第226章第140章第8章第146章第24章第81章第26章第44章第211章第78章第163章第183章第68章第33章第136章第112章第139章第38章第121章第46章第228章第170章第106章第3章第42章第16章第77章第119章第124章第180章第167章第132章第82章第91章第137章第86章第54章第146章第26章第115章第57章第69章第212章第151章第42章第215章第129章第107章第23章第158章第77章第58章
第122章第204章第4章第20章第13章第95章第36章第97章第140章第156章第72章第25章第116章第178章第219章第90章第144章第170章第66章第227章第142章第1章第1章第1章第131章第205章第55章第22章第156章第89章第116章第184章第212章第96章第9章第220章第49章第124章第177章第92章第86章第173章第4章第189章第206章第213章第221章第226章第140章第8章第146章第24章第81章第26章第44章第211章第78章第163章第183章第68章第33章第136章第112章第139章第38章第121章第46章第228章第170章第106章第3章第42章第16章第77章第119章第124章第180章第167章第132章第82章第91章第137章第86章第54章第146章第26章第115章第57章第69章第212章第151章第42章第215章第129章第107章第23章第158章第77章第58章
主站蜘蛛池模板: 澎湖县| 清丰县| 漳平市| 寿宁县| 隆昌县| 江阴市| 庄浪县| 乌恰县| 启东市| 奉新县| 蒲江县| 吴忠市| 淮北市| 岳池县| 贞丰县| 库尔勒市| 南阳市| 重庆市| 峨山| 南靖县| 益阳市| 大新县| 吉水县| 宝应县| 嘉善县| 建昌县| 瑞金市| 双辽市| 罗田县| 武山县| 靖宇县| 青阳县| 昌乐县| 钟山县| 库伦旗| 筠连县| 宾川县| 西吉县| 如皋市| 五常市| 井冈山市|