23 รูปแบบการออกแบบบทที่ 18: รูปแบบบันทึก Java
คำจำกัดความ: จับสถานะภายในของวัตถุโดยไม่ทำลายการห่อหุ้มและบันทึกสถานะนี้ออกไปนอกวัตถุ สิ่งนี้จะคืนค่าวัตถุไปยังสถานะเดิมที่บันทึกไว้
ประเภท: คลาสพฤติกรรม
แผนภาพชั้นเรียน:
เมื่อเรากำลังเขียนโปรแกรมเรามักจะต้องบันทึกสถานะกลางของวัตถุและเมื่อจำเป็นเราสามารถกู้คืนกลับสู่สถานะนี้ได้ ตัวอย่างเช่นเมื่อเราใช้ Eclipse ในการโปรแกรมหากเราทำผิดพลาดเป็นลายลักษณ์อักษร (ตัวอย่างเช่นลบรหัสสองสามบรรทัดโดยไม่ตั้งใจ) เราต้องการส่งคืนสถานะก่อนการลบดังนั้นเราจึงสามารถใช้ Ctrl+Z เพื่อส่งคืน ในเวลานี้เราสามารถใช้โหมดบันทึกเพื่อให้ได้มัน
โครงสร้างของโหมดบันทึกช่วยจำ
ผู้ริเริ่ม: บันทึกสถานะภายในของช่วงเวลาปัจจุบันรับผิดชอบในการกำหนดว่ารัฐใดเป็นของขอบเขตการสำรองข้อมูลและรับผิดชอบในการสร้างและกู้คืนข้อมูลบันทึกข้อตกลง
บันทึกข้อตกลง: รับผิดชอบในการจัดเก็บสถานะภายในของวัตถุผู้ริเริ่มและให้สถานะภายในที่กำหนดโดยผู้ริเริ่มเมื่อจำเป็น
บทบาทการจัดการ: จัดการบันทึกบันทึกบันทึกและให้บันทึก
การใช้รหัสทั่วไป
ผู้ริเริ่มคลาส {สถานะสตริงส่วนตัว = ""; สตริงสาธารณะ getState () {return state; } โมฆะสาธารณะ setState (สถานะสตริง) {this.state = state; } Public Memento CreateMemento () {ส่งคืน Memento ใหม่ (this.state); } โมฆะสาธารณะ Restorememento (Memento Memento) {this.setState (memento.getState ()); }} คลาส Memento {Private String State = ""; ของที่ระลึกสาธารณะ (สถานะสตริง) {this.state = state; } สตริงสาธารณะ getState () {return state; } โมฆะสาธารณะ setState (สถานะสตริง) {this.state = state; }} ผู้ดูแลชั้นเรียน {Private Memento Memento; Public Memento GetMemento () {return memento; } โมฆะสาธารณะ setMemento (Memento Memento) {this.memento = Memento; }} ไคลเอนต์คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (String [] args) {ผู้สร้างผู้สร้าง = ผู้สร้างใหม่ (); ผู้ริเริ่ม. SetState ("สถานะ 1"); System.out.println ("สถานะเริ่มต้น:"+ผู้เริ่มต้น GetState ()); ผู้ดูแลผู้ดูแล = ผู้ดูแลใหม่ (); ผู้ดูแล. SetMemento (ผู้ริเริ่ม. CreateMemento ()); ผู้เริ่มต้น SetState ("Status2"); System.out.println ("สถานะหลังจากการเปลี่ยนแปลง:"+originator.getState ()); ผู้ริเริ่ม. restorememento (caretaker.getMemento ()); System.out.println ("สถานะหลังจากการกู้คืน:"+originator.getState ()); - รหัสแสดงตัวอย่างของการสำรองข้อมูลเดียวสถานะเดียว ตรรกะนั้นง่ายมาก: ตัวแปรสถานะในคลาสผู้ริเริ่มจะต้องได้รับการสำรองเพื่อให้สามารถกู้คืนได้เมื่อจำเป็น ในคลาสของ Memento นอกจากนี้ยังมีตัวแปรสถานะที่ใช้ในการจัดเก็บสถานะชั่วคราวของตัวแปรสถานะในคลาสผู้ริเริ่ม และคลาสผู้ดูแลใช้ในการจัดการคลาสบันทึกซึ่งใช้ในการเขียนสถานะหรือดึงสถานะลงในวัตถุบันทึกข้อตกลง
บันทึกมัลติแบ็คอัพหลายรัฐ
ในตัวอย่างของการสาธิตรหัสทั่วไปคลาสผู้ริเริ่มมีตัวแปรสถานะเดียวที่ต้องสำรองในขณะที่โดยปกติบทบาทผู้ริเริ่มมักจะเป็น Javabean มีตัวแปรมากกว่าหนึ่งตัวที่ต้องสำรองในวัตถุและมากกว่าหนึ่งรัฐที่ต้องได้รับการสำรอง นี่คือบันทึกหลายรัฐหลายรัฐ
มีหลายวิธีในการใช้บันทึกช่วยจำ มีการเสียรูปและวิธีการประมวลผลมากมายสำหรับบันทึกช่วยจำ วิธีการเช่นรหัสทั่วไปโดยทั่วไปไม่ได้ใช้ ในกรณีส่วนใหญ่บันทึกช่วยจำเป็นหลายรัฐและการสำรองข้อมูลหลายครั้ง ในความเป็นจริงมันเป็นเรื่องง่ายมากที่จะใช้หลายรัฐและหลายแบ็คอัพ วิธีที่ใช้กันมากที่สุดคือการเพิ่มคอนเทนเนอร์แผนที่ลงใน Memento เพื่อจัดเก็บทุกรัฐและใช้คอนเทนเนอร์แผนที่ในคลาส Caretaker เพื่อจัดเก็บการสำรองข้อมูลทั้งหมด ด้านล่างเราให้ตัวอย่างของหลายรัฐและหลายแบ็คอัพ:
ผู้ริเริ่มคลาส {Private String State1 = ""; สตริงส่วนตัว state2 = ""; สตริงส่วนตัว state3 = ""; สตริงสาธารณะ getState1 () {return state1; } โมฆะสาธารณะ setState1 (String state1) {this.state1 = state1; } สตริงสาธารณะ getState2 () {return state2; } โมฆะสาธารณะ setState2 (String state2) {this.state2 = state2; } สตริงสาธารณะ getState3 () {return state3; } โมฆะสาธารณะ setState3 (String state3) {this.state3 = state3; } Public Memento CreateMemento () {ส่งคืน Memento ใหม่ (beanutils.backupprop (นี่)); } โมฆะสาธารณะ Restorememento (Memento Memento) {beanutils.restoreprop (นี่, memento.getStateMap ()); } สตริงสาธารณะ toString () {return "state1 ="+state1+"state2 ="+state2+"state3 ="+state3; }} คลาส Memento {แผนที่ส่วนตัว <สตริงวัตถุ> Statemap; Public Memento (แผนที่ <String, Object> MAP) {this.stateMap = MAP; } แผนที่สาธารณะ <สตริงวัตถุ> getStateMap () {return statemap; } โมฆะสาธารณะ setStateMap (แผนที่ <string, object> statemap) {this.stateMap = statemap; }} คลาส beanutils {แผนที่สาธารณะคงที่ <String, Object> backupprop (Object Bean) {Map <String, Object> result = new HashMap <String, Object> (); ลอง {beaninfo beaninfo = introspector.getBeanInfo (bean.getClass ()); PropertyDescriptor [] descriptors = beaninfo.getPropertyDescriptors (); สำหรับ (PropertyDescriptor des: descriptors) {String fieldName = des.getName (); วิธี getter = des.getReadMethod (); Object FieldValue = getter.invoke (ถั่ว, วัตถุใหม่ [] {}); if (! fieldName.equalsignorecase ("คลาส")) {result.put (fieldName, fieldValue); }}}} catch (Exception E) {E.printStackTrace (); } ผลตอบแทนผลลัพธ์; } โมฆะคงที่สาธารณะ restoreprop (Object Bean, MAP <String, Object> Propmap) {ลอง {beaninfo beaninfo = introspector.getBeanInfo (bean.getClass ()); PropertyDescriptor [] descriptors = beaninfo.getPropertyDescriptors (); สำหรับ (PropertyDescriptor des: descriptors) {String fieldName = des.getName (); if (propmap.containskey (fieldName)) {method setter = des.getWriteMethod (); setter.invoke (ถั่ว, วัตถุใหม่ [] {propmap.get (fieldName)}); }}} catch (exception e) {e.printstacktrace (); }}} ผู้ดูแลชั้นเรียน {แผนที่ส่วนตัว <สตริง, memento> memmap = new hashmap <string, memento> (); Public Memento GetMemento (ดัชนีสตริง) {return memmap.get (ดัชนี); } โมฆะสาธารณะ setMemento (ดัชนีสตริง, Memento Memento) {this.memmap.put (ดัชนี, Memento); }} ไคลเอนต์คลาส {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ผู้สร้าง Ori = ใหม่ผู้สร้างใหม่ (); ผู้ดูแลผู้ดูแล = ผู้ดูแลใหม่ (); ori.setstate1 ("จีน"); ori.setstate2 ("แข็งแกร่ง"); ori.setstate3 ("ความเจริญรุ่งเรือง"); System.out.println ("=== สถานะการเริ่มต้น ====/n"+ori); ผู้ดูแล. SetMemento ("001", Ori.CreateMemento ()); ori.setState1 ("ซอฟต์แวร์"); ori.setstate2 ("โครงสร้าง"); ori.setstate3 ("ยอดเยี่ยม"); System.out.println ("=== สถานะที่แก้ไข ====/n"+ori); ori.restorememento (Caretaker.getMemento ("001")); System.out.println ("=== สถานะคืนค่า ====/n"+ori); - ข้อดีและข้อเสียของโหมดบันทึกข้อตกลงและสถานการณ์ที่เกี่ยวข้อง
ข้อดีของโหมดบันทึกคือ:
เมื่อสถานะในการเปลี่ยนแปลงบทบาทของผู้ริเริ่มอาจเป็นการเปลี่ยนแปลงที่ผิด เราสามารถกู้คืนการเปลี่ยนแปลงที่ไม่ถูกต้องนี้โดยใช้โหมดบันทึก
สถานะของการสำรองข้อมูลจะถูกบันทึกไว้นอกบทบาทผู้ริเริ่มดังนั้นบทบาทผู้ริเริ่มไม่จำเป็นต้องจัดการสถานะของการสำรองข้อมูลแต่ละครั้ง
ข้อเสียของโหมดบันทึกคือ:
ในแอปพลิเคชันจริงโหมดบันทึกข้อตกลงคือหลายรัฐและหลายแบ็คอัพ สถานะของบทบาทผู้ริเริ่มจะต้องเก็บไว้ในวัตถุบันทึกข้อตกลงซึ่งใช้ทรัพยากรค่อนข้างรุนแรง
หากคุณต้องการให้การดำเนินการย้อนกลับการใช้โหมดบันทึกนั้นเหมาะสมมากเช่นการดำเนินการธุรกรรม JDBC การกู้คืน Ctrl+Z ของตัวแก้ไขข้อความ ฯลฯ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น