23 디자인 패턴 18 장 : Java 각서 패턴
정의 : 캡슐화를 파괴하지 않고 객체의 내부 상태를 캡처 하고이 상태를 물체 외부에 저장하십시오. 이것은 원래 저장 상태로 개체를 복원합니다.
유형 : 행동 클래스
클래스 다이어그램 :
우리가 프로그래밍 할 때, 우리는 종종 물체의 중간 상태를 저장해야하며, 필요할 때이 상태로 복원 할 수 있습니다. 예를 들어, Eclipse to Program을 사용하는 경우 서면으로 실수를하는 경우 (예 : 실수로 몇 줄의 코드를 삭제 한 경우) 삭제 전에 상태를 반환하려면 CTRL+Z를 사용하여 반환 할 수 있습니다. 현재 메모 모드를 사용하여 달성 할 수 있습니다.
메모 모드의 구조
개시 자 : 현재 순간의 내부 상태를 기록하고, 주가 백업 범위에 속한 상태를 정의하고 메모 데이터를 작성하고 복원 할 책임이 있습니다.
각서 : 개시 자 개체의 내부 상태를 저장하고 필요할 때 개시자가 요구하는 내부 상태를 제공합니다.
관리 역할 : 각서 관리, 저장 및 각서를 제공합니다.
일반 코드 구현
클래스 독창적 인 {private String state = ""; 공개 문자열 getState () {return state; } public void setstate (문자열 상태) {this.state = state; } public memento creatememento () {return new Memento (this.state); } public void restorememento (memento memento) {this.setstate (memento.getState ()); }} class memento {private String state = ""; public memento (문자열 상태) {this.state = state; } public String getState () {return state; } public void setstate (문자열 상태) {this.state = state; }} Class Caretaker {private memento memento; public memento getmemento () {return memento; } public void setmemento (memento memento) {this.memento = memento; }} public class client {public static void main (String [] args) {originator originator = new originator (); originator.setstate ( "상태 1"); System.out.println ( "초기 상태 :"+originator.getState ()); 관리인 간병인 = New Caretaker (); Caretaker.setmemento (originator.creatememento ()); originator.setstate ( "status2"); System.out.println ( "변경 후 상태 :"+originator.getState ()); originator.restorememento (caretaker.getmemento ()); System.out.println ( "복구 후 상태 :"+originator.getState ()); }} 코드는 단일 상태 단일 백업의 예를 보여줍니다. 논리는 매우 간단합니다. 원시 클래스의 상태 변수는 필요할 때 복원 할 수 있도록 백업해야합니다. Memento 클래스에는 창시자 클래스에 상태 변수의 임시 상태를 저장하는 데 사용되는 상태 변수도 있습니다. 관리인 클래스는 각서 클래스를 관리하는 데 사용되며, 이는 상태를 작성하거나 각서 대상으로 상태를 검색하는 데 사용됩니다.
멀티 스테이트 멀티 백 up up-backup 메모
일반 코드 데모의 예에서, 원래 코드 클래스에는 백업이 필요한 단 하나의 상태 변수 만 가지고 있지만, 일반적으로 개시 자 역할은 일반적으로 Javabean이며, 개체에 백업 해야하는 둘 이상의 변수가 있으며, 백업 해야하는 하나 이상의 상태가 있습니다. 이것은 멀티 스테이트 멀티 백 up up-backup 메모입니다.
메모를 구현하는 방법에는 여러 가지가 있습니다. 메모에는 많은 변형 및 처리 방법이 있습니다. 일반 코드와 같은 방법은 일반적으로 사용되지 않습니다. 대부분의 경우 메모는 다중 상태 및 여러 백업입니다. 실제로 멀티 스테이트 및 멀티 백업을 구현하는 것은 매우 간단합니다. 가장 일반적으로 사용되는 방법은 Memento에 맵 컨테이너를 추가하여 모든 상태를 저장하고 관리자 클래스의 맵 컨테이너를 사용하여 모든 백업을 저장하는 것입니다. 아래에서 우리는 다중 주 및 멀티 백 up의 예를 제공합니다.
클래스 원문자 {private String State1 = ""; 개인 문자열 state2 = ""; 개인 문자열 state3 = ""; 공개 문자열 getState1 () {return state1; } public void setstate1 (String State1) {this.state1 = state1; } public String getState2 () {return state2; } public void setstate2 (String State2) {this.state2 = state2; } public String getState3 () {return state3; } public void setstate3 (String State3) {this.state3 = state3; } public memento creatememento () {return new memento (beanutils.backupprop (this)); } public void restorememento (memento memento) {beanutils.restoreprop (this, memento.getStatemap ()); } public String toString () {return "state1 ="+state1+"state2 ="+state2+"state3 ="+state3; }} class memento {private map <string, object> statemap; public memento (map <string, object> map) {this.statemap = map; } public map <string, object> getStatemap () {return Statemap; } public void setStatemap (map <string, object> statemap) {this.statemap = statemap; }} class beanutils {public static map <string, object> backupprop (object bean) {map <string, object> result = new Hashmap <String, Object> (); try {beaninfo beaninfo = introspector.getBeanInfo (bean.getClass ()); PropertyDescriptor [] descriptors = beanInfo.getPropertyDescriptors (); for (propertyDescriptor des : descriptors) {String fieldName = des.getName (); 메소드 getter = des.getReadMethod (); Object FieldValue = getter.invoke (Bean, New Object [] {}); if (! fieldName.equalSeignoreCase ( "class")) {result.put (fieldName, FieldValue); }}}} catch (예외 e) {e.printstacktrace (); } 반환 결과; } public static void restoreProp (Object Bean, Map <String, Object> propMap) {try {beanInfo beanInfo = introstector.getBeanInfo (bean.getClass ()); PropertyDescriptor [] descriptors = beanInfo.getPropertyDescriptors (); for (propertyDescriptor des : descriptors) {String fieldName = des.getName (); if (propmap.containskey (FieldName)) {method setter = des.getWritemEthod (); setter.invoke (bean, new Object [] {propmap.get (fieldName)}); }}} catch (예외 e) {e.printstacktrace (); }}} class Caretaker {private map <string, memento> memmap = new Hashmap <String, memento> (); public memento getmemento (String Index) {return memmap.get (index); } public void setmemento (문자열 색인, memento memento) {this.memmap.put (index, memento); }} class client {public static void main (String [] args) {originator ori = new originator (); 관리인 간병인 = New Caretaker (); ori.setstate1 ( "중국"); ori.setstate2 ( "strong"); ori.setstate3 ( "번영"); System.out.println ( "=== 초기화 상태 ===/n"+ORI); Caretaker.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을 더 지원하기를 바랍니다.