当前位置: 首页 > 后端技术 > Java

设计模式学习21(Java实现)——备忘模式

时间:2023-04-02 09:25:28 Java

鍐欏湪鍓嶉潰锛岃褰曞涔犺璁℃ā寮忕殑绗旇锛屾彁楂樿璁℃ā寮忕殑鐏垫椿杩愮敤瀛︿範鍦板潃https://www.bilibili.com/video...https://www.bilibili.com/video...鍙傝€冩枃绔爃ttp://c.biancheng.net/view/1...椤圭洰婧愮爜https://gitee.com/zhuang-kang/DesignPattern23,memo妯″紡23.1MediatorMode瀹氫箟鍙婄壒鐐筂emento妯″紡瀹氫箟锛氬湪涓嶇牬鍧忓皝瑁呯殑鍓嶆彁涓嬶紝鎹曡幏涓€涓璞$殑鍐呴儴鐘舵€侊紝骞跺皢杩欎釜鐘舵€佷繚瀛樺湪瀵硅薄澶栭儴锛屼互渚夸互鍚庨渶瑕佺殑鏃跺€欏彲浠ユ仮澶嶅璞″師鏉ョ殑鐘舵€佷繚瀛樼殑鐘舵€併€傝繖绉嶆ā寮忎篃绉颁负蹇収妯″紡銆傚蹇樺綍妯″紡鏄竴绉嶅璞?琛屼负妯″紡锛屽叾涓昏浼樼偣濡備笅銆傛彁渚涗竴绉嶅彲浠ユ仮澶嶇姸鎬佺殑鏈哄埗銆傚綋鐢ㄦ埛闇€瑕佹椂锛屾洿鏂逛究鍦板皢鏁版嵁鎭㈠鍒版煇涓巻鍙茬姸鎬併€傚疄鐜颁簡鍐呴儴鐘舵€佺殑灏佽銆傞櫎浜嗗垱寤哄畠鐨勫彂璧疯€呬箣澶栵紝娌℃湁鍏朵粬瀵硅薄鍙互璁块棶姝ょ姸鎬佷俊鎭€傜畝鍖栫殑鍚姩浜虹被銆傚彂璧疯€呮棤闇€绠$悊鍜屼繚瀛樺叾鍐呴儴鐘舵€佺殑鍗曠嫭澶囦唤锛屾墍鏈夌姸鎬佷俊鎭繚瀛樺湪澶囧繕褰曚腑锛岀敱绠$悊鑰呯鐞嗭紝绗﹀悎鍗曚竴璐d换鍘熷垯銆傚畠鐨勪富瑕佺己鐐规槸锛氳祫婧愭秷鑰楀ぇ銆傚鏋滆淇濆瓨鐨勫唴閮ㄧ姸鎬佷俊鎭繃澶氭垨鑰呴潪甯搁绻侊紝浼氬崰鐢ㄦ瘮杈冨ぇ鐨勫唴瀛樿祫婧愩€?3.2澶囧繕褰曟ā寮忕殑缁撴瀯鍜屽疄鐜?3.2.1澶囧繕褰曟ā寮忕殑缁撴瀯銆傚彂璧疯€咃紙Originator锛夎鑹诧細璁板綍褰撳墠鏃跺埢鐨勫唴閮ㄧ姸鎬佷俊鎭紝鎻愪緵鍒涘缓澶囧繕褰曞拰鎭㈠澶囧繕褰曟暟鎹殑鍔熻兘锛屽疄鐜板叾浠栦笟鍔″姛鑳姐€傚畠鍙互璁块棶澶囧繕褰曚腑鏁版嵁鐨勬墍鏈変俊鎭€侻emento瑙掕壊锛氳礋璐e瓨鍌╥nitiator鐨勫唴閮ㄧ姸鎬侊紝骞跺湪闇€瑕佺殑鏃跺€欏皢杩欎簺鍐呴儴鐘舵€佹彁渚涚粰initiator銆傜鐞嗚€咃紙Caretaker锛夎鑹诧細绠$悊澶囧繕褰曪紝鎻愪緵淇濆瓨鍜岃幏鍙栧蹇樺綍鐨勫姛鑳斤紝浣嗕笉鑳借闂拰淇敼澶囧繕褰曠殑鍐呭銆備竴涓蹇樺綍鏈変袱涓瓑浠风殑鎺ュ彛锛氱獎鎺ュ彛锛氱湅瀹堝璞★紙浠ュ強鍙戣捣鑰呭璞′互澶栫殑浠讳綍瀵硅薄锛夌湅鍒板蹇樺綍鐨勭獎鎺ュ彛锛坣arrorInterface锛夛紝瀹冨彧鍏佽浠栧皢澶囧繕褰曞璞′紶閫掔粰鍏朵粬瀵硅薄銆俉ideInterface锛氫笌manager鐪嬪埌鐨刵arrowinterface鐩稿弽锛宨nitiatorobject鍙互鐪嬪埌涓€涓獁ideinterface锛坵ideInterface锛夛紝杩欎娇寰楀畠鍙互璇诲彇鎵€鏈夌殑鏁版嵁锛屼互渚挎牴鎹繖浜涙暟鎹潵鎭㈠initiator瀵硅薄鐨勫唴閮ㄧ姸鎬併€?3.2.2浠g爜瀹炵幇浜嗘父鎴忎腑鐨勬煇涓満鏅€傛父鎴忚鑹叉嫢鏈夌敓鍛藉姏銆佹敾鍑诲姏銆侀槻寰″姏绛夋暟鎹€傛墦boss鍓嶅悗浼氫笉涓€鏍枫€傛垜浠鐜╁瑙夊緱涓巄oss鍐虫枟鐨勬晥鏋滃苟涓嶇悊鎯炽€傚彲浠ュ皢娓告垙鎭㈠鍒板喅鏂楀墠鐨勭姸鎬併€傚疄鐜颁笂杩版渚嬶紝鏈変袱绉嶆柟寮忥細鈥滅櫧鐩掆€濆蹇樺綍妯″紡鍜屸€滈粦鐩掆€濆蹇樺綍妯″紡鎵撳紑鍏崇郴绫诲浘鍒版墍鏈夊璞ameRolepackagecom.zhuang.memento.white_box;/***@ClassnameGameRole*@鎻忚堪娓告垙瑙掕壊绫?@Date2021/3/2910:14*@Createdbydell*/publicclassGameRole{privateintvit;//vitalityprivateintatk;//attackprivateintdef;//defense//鍒濆鍖栫姸鎬乸ublicvoidinitState(){this.vit=100;杩欎釜.atk=100;杩欎釜.def=100;}//鎴樻枟publicvoidfight(){this.vit=0;杩欎釜.atk=0;杩欎釜.def=0;}//淇濆瓨瑙掕壊鐘舵€乸ublicRoleStateMementosaveState(){returnnewRoleStateMemento(vit,atk,def);}//鎭㈠瑙掕壊鐘舵€乸ublicvoidrecoverState(RoleStateMementoroleStateMemento){this.vit=roleStateMemento.getVit();this.atk=roleStateMemento.getAtk();this.def=roleStateMemento.getDef();}//鏄剧ず鐘舵€乸ublicvoidstateDisplay(){System.out.println("浜虹墿娲诲姏"+vit);System.out.println("瑙掕壊鏀诲嚮鍔?+atk);System.out.println("瑙掕壊闃叉姢鍔?+def);}publicintgetVit(){杩斿洖vit锛泒publicvoidsetVit(intvit){this.vit=vit;}publicintgetAtk(){杩斿洖鏀诲嚮鍔涳紱}publicvoidsetAtk(intatk){this.atk=atk;}publicintgetDef(){杩斿洖瀹氫箟锛泒publicvoidsetDef(intdef){this.def=def;}}RoleStateMementopackagecom.zhuang.memento.white_box;/***@ClassnameRoleStateMemento*@Description娓告垙鐘舵€佸瓨鍌ㄧ被澶囧繕璁板綍绫?@Date2021/3/2910:14*@Createdbydell*/publicclassRoleStateMemento{private浣撳唴娲诲姏锛涚浜烘儏鎶ユ敾鍑伙紱绉佷汉瀹氫箟锛沺ublicRoleStateMemento(intvit,intatk,intdef){this.vit=vit;this.atk=鏀诲嚮鍔涳紱杩欎釜.def=def;}publicintgetVit(){杩斿洖vit锛泒publicvoidsetVit(intvit){this.vit=vit;}publicintgetAtk(){杩斿洖鏀诲嚮鍔涳紱}publicvoidsetAtk(intatk){this.atk=atk;}publicintgetDef(){杩斿洖瀹氫箟锛泒publicvoidsetDef(intdef){this.def=def;}}RoleStateCaretakerpackagecom.zhuang.memento.white_box;/***@ClassnameRoleStateCaretaker*@Description瑙掑害鐘舵€佺鐞嗙被*@Date2021/3/2910:15*@Createdbydell*/publicclassRoleStateCaretaker{privateRoleStateMementoroleStateMemento;publicRoleStateMementogetRoleStateMemento(){杩斿洖roleStateMemento;}publicvoidsetRoleStateMemento(RoleStateMementoroleStateMemento){this.roleStateMemento=roleStateMemento;}}Clientpackagecom.zhuang.memento.white_box;/***@ClassnameClient*@Description澶囧繕褰曟ā寮忕櫧绠辨祴璇曠被*@Date2021/3/2910:15*@Createdbydell*/publicclassClient{publicstaticvoidmain(String[]args){System.out.println("------------澶ф垬Boss鍓?---------------------");//澶ф垬Boss鍓岹ameRolegameRole=newGameRole();gameRole.initState();gameRole.stateDisplay();//淇濆瓨杩涘害RoleStateCaretakerroleStateCaretaker=newRoleStateCaretaker();roleStateCaretaker.setRoleStateMemento(gameRole.saveState());System.out.println("---------------Boss鎴樺悗------------------------");//Boss鎴樹弗閲嶇(鎹焔ameRole.fight();gameRole.stateDisplay();System.out.println("------------婊¤澶嶆椿------------------------");gameRole.recoverState(roleStateCaretaker.getRoleStateMemento());gameRole.stateDisplay();}}23.2.2.2Black-boxmementopatternmemento瑙掕壊涓篿nitiator瀵硅薄鎻愪緵瀹芥帴鍙o紝涓哄叾浠栧璞℃彁渚涘鎺ュ彛Narrowinterface鍦↗ava璇█涓紝瀹炵幇鍙岄噸鎺ュ彛鐨勬柟寮忔槸灏唌emo绫昏璁′负鍚姩浜虹被鐨勫唴閮ㄦ垚鍛樼被銆傚皢RoleStateMemento璁剧疆涓篏ameRole鐨勫唴閮ㄧ被锛屼粠鑰屽皝瑁匞ameRole涓殑RoleStateMemento瀵硅薄锛涙彁渚涙爣璇嗘帴鍙emento锛屼緵RoleStateCaretaker绛夊璞′娇鐢ㄣ€傝繖鏍稧ameRole绫荤湅鍒扮殑鏄疪oleStateMemento鐨勬墍鏈夋帴鍙o紝鑰孯oleStateCaretaker绛夊璞$湅鍒扮殑鍙槸鏍囪瘑鎺ュ彛Memento鏆撮湶鐨勬帴鍙o紝浠庤€屼繚鎸佷簡灏佽鎬с€傜被鍥惧涓嬶細GameRolepackagecom.zhuang.memento.black_box;importcom.zhuang.memento.white_box.RoleStateMemento;/***@ClassnameGameRole*@Description娓告垙瑙掕壊绫?@Date2021/3/2910:14*@Createdbydell*/publicclassGameRole{privateintvit;//娲诲姏privateintatk;//鏀诲嚮privateintdef;//闃插尽//鍒濆鍖栫姸鎬乸ublicvoidinitState(){this.vit=100;杩欍€傛敾鍑诲姏=100锛涜繖涓?def=100;}//鎴樻枟publicvoidfight(){this.vit=0;杩欎釜.atk=0;杩欎釜.def=0;}//淇濆瓨瑙掕壊鐘舵€乸ublicMementosaveState(){returnnewRoleStateMemento(vit,atk,def);}//鎭㈠瑙掕壊鐘舵€乸ublicvoidrecoverState(Mementomemento){RoleStateMementoroleStateMemento=(RoleStateMemento)memento;this.vit=roleStateMemento.getVit();this.atk=roleStateMemento.getAtk();this.def=roleStateMemento.getDef();}//鏄剧ず鐘舵€乸ublicvoidstateDisplay(){System.out.println("瑙掕壊娲诲姏"+vit);System.out.println("瑙掕壊鏀诲嚮"+atk);System.out.println("瑙掕壊闃插尽"+def);}publicintgetVit(){杩斿洖vit锛泒publicvoidsetVit(intvit)}publicintgetAtk(){returnatk;}publicvoidsetAtk(intatk){杩欎釜銆傛敾鍑诲姏=鏀诲嚮鍔涳紱}publicintgetDef(){杩斿洖瀹氫箟锛泒publicvoidsetDef(intdef){this.def=def;}//鍐呴儴瀹氫箟澶囧繕褰昳nternalclassRoleStateMemento(鍐呴儴绫昏缃负private)privateclassRoleStateMementoimplementsMemento{privateintvit;绉佷汉鎯呮姤鏀诲嚮锛涚浜哄畾涔夛紱publicRoleStateMemento(intvit,intatk,intdef){this.vit=vit;this.atk=鏀诲嚮鍔涳紱杩欎釜.def=def;}publicintgetVit(){杩斿洖vit锛泒publicvoidsetVit(intvit){this.vit=vit;}publicintgetAtk(){杩斿洖鏀诲嚮鍔涳紱}鍏叡鏃犳晥灏忓彿etAtk(intatk){this.atk=atk;}publicintgetDef(){杩斿洖瀹氫箟锛泒publicvoidsetDef(intdef){this.def=def;}}}Mementopackagecom.zhuang.memento.black_box;/***@ClassnameMemento*@Description绐佹帴鍙?@Date2021/3/2910:40*@Createdbydell*/publicinterfaceMemento{}RoleStateCaretakerpackagecom.zhuang.memento.black_box;/***@ClassnameRoleStateCaretaker*@Description瑙掑害鐘舵€佺鐞嗙被*@Date2021/3/2910:15*@Createdbydell*/publicclassRoleStateCaretaker{privateMementomemento;鍏叡绾康鍝乬etMemento(){杩斿洖绾康鍝侊紱}publicvoidsetMemento(Mementomemento){this.memento=memento;}}Clientpackagecom.zhuang.memento.black_box;/***@ClassnameClient*@Description澶囧繕褰曟ā寮忛粦绠辨祴璇曠被*@Date2021/3/2910:15*@Createdbydell*/publicclassClient{publicstaticvoidmain(String[]args){System.out.println("--------------Boss鎴樺墠------------------------");//Boss鎴樺墠鐨凣ameRolegameRole=newGameRole();gameRole.initState();gameRole.stateDisplay();//淇濆瓨杩涘害RoleStateCaretakerroleStateCaretaker=newRoleStateCaretaker();roleStateCaretaker.setMemento(gameRole.saveState());System.out.println("---------------Boss鎴樼粨鏉熷悗------------------------");//Boss鎴樻秷鑰椾弗閲峠ameRole.fight();gameRole.stateDisplay();System.out.println("------------婊¤澶嶆椿--------------------");gameRole.recoverState(roleStateCaretaker.getMemento());gameRole.stateDisplay();}}23.3Memento妯″紡搴旂敤鍦烘櫙闇€瑕佷繚瀛樺拰鎭㈠鏁版嵁锛屾瘮濡傜帺娓告垙鏃朵腑闂寸粨鏋滅殑褰掓。鍔熻兘锛岄渶瑕佹彁渚涗竴涓洖婊氭搷浣滃満鏅紝濡俉ord銆丯otepad銆丳hotoshop銆乮dea绛夎蒋浠讹紝缂栬緫鏃舵寜Ctrl+Z缁勫悎閿紝浠ュ強鏁版嵁搴撲腑鐨勪簨鍔℃搷浣?3.4澶囧繕褰曟ā寮忕殑娉ㄩ噴鍜岀粏鑺備负鐢ㄦ埛鎻愪緵鍙仮澶嶇殑鏈哄埗锛岃繖鍙互璁╃敤鎴锋洿鏂逛究鐨勫洖鍒版煇涓巻鍙茬姸鎬侊紝瀹炵幇淇℃伅鐨勫皝瑁咃紝璁╃敤鎴蜂笉鐢ㄥ叧蹇冧繚瀛樿繃澶氱殑缁嗚妭绫荤殑鎴愬憳鍙橀噺锛屽崰鐢ㄨ祫婧愭瘮杈冨ぇ锛岃€屼笖姣忎釜save浼氭秷鑰椾竴瀹氱殑鍐呭瓨銆傚啓鍦ㄦ渶鍚庡鏋滄垜鐨勬枃绔犲浣犳湁鐢紝璇风粰鎴戜竴涓煈嶏紝璋㈣阿馃槉锛佹湁浠€涔堥棶棰樻杩庡湪璇勮鍖烘寚鍑猴紒馃挭