추상 문서 패턴

Abstract Document Pattern

느슨하게 타이핑된 키 값 저장소에 객체를 구성하고 타이핑된 뷰를 사용하여 데이터를 노출하기 위한 객체 지향 구조 설계 패턴. 패턴의 목적은 형식 안전성의 지원을 잃지 않고, 새로운 속성을 즉시 객체 트리에 추가할 수 있는 강력한 형식의 언어로 구성요소들 간의 높은 유연성을 달성하는 것이다. 이 패턴은 한 클래스의 서로 다른 특성을 다른 인터페이스로 분리하기 위해 특성을 사용한다.[1] "문서"라는 용어는 문서 지향 데이터베이스에서 유래되었다.

정의

문서는 여러 속성을 포함하는 객체다. 예를 들어, 속성은 숫자나 문자열과 같은 값이 될 수 있고, 다른 문서의 목록이 될 수 있다. 모든 속성은 키를 사용하여 참조된다.[2] 문서 트리를 통과할 때 사용자는 다음 단계의 구현 클래스를 만드는 데 사용할 생성자를 지정한다. 구현은 종종 문서 인터페이스를 확장하는 다양한 특성의 결합으로, 그들 스스로 설정과 속성 획득을 처리할 수 있게 한다.

구조

Abstract Document Pattern Example

인터페이스 "문서"는 속성은 "put" 방법을 사용하여 편집할 수 있고, "get" 방법을 사용하여 읽을 수 있으며, 하위 문서는 "child" 방법을 사용하여 통과할 수 있다고 명시되어 있다. "어린이" 방법은 어린이가 가져야 하는 데이터의 지도를 주어진 어린이의 타이핑된 보기를 생성할 수 있는 방법에 대한 기능적 참조가 필요하다. 지도는 원본 지도에 대한 포인터가 되어야 보기의 변경사항이 원본 문서에도 영향을 미칠 수 있다.

구현은 서로 다른 속성을 설명하는 여러 특성 인터페이스에서 상속할 수 있다. 다중 구현은 동일한 맵을 공유할 수도 있는데, 이 패턴이 구현 설계에 가해지는 유일한 제한사항은 "BaseDocument"에서 상속된 속성을 제외하고 상태 비저장 상태여야 한다는 것이다.

가성음

인터페이스 문서 put(키:String, 값:Object):객체 get(키:String):객체 children(키:String, 생성자:Map<, String, Object>, ->&T):T[]추상 클래스 BaseDocument은 문서 속성:Map<, String, Object>, this-> constructor(속성:Map<, String, Object>.), 속성:= 속성 implemenTput(키:String, 값:Object):개체 반환 this->, properties->, put(가치 핵심)도구 get(키:String):개체 반환 this->, properties->, get(키)도구 children(키:String, 생성자:Map<, String, Object>, ->&T):T[]을 만든다고 결과:= 새로운 T[]을 만든다고 아이들:)this->, 프로입니다perties->, get(키)castTo 맵<String, Object>[] 포러치(자녀) 결과[] := constructor->appy(자녀) 반환 결과 

사용법

Obstract Document Pattern은 개발자가 구성 설정과 같은 변수를 유형화되지 않은 트리 구조에 저장하고 타이핑된 보기를 사용하여 문서에서 작업할 수 있도록 한다. 내부 문서 구조에 영향을 미치지 않고 새로운 보기 또는 대체 보기 구현이 생성될 수 있다. 이것의 장점은 보다 느슨하게 결합되는 시스템이지만, 부동산의 상속형태가 항상 확실한 것은 아니기 때문에 주물 오류의 위험도 증가시킨다.

구현 예

추상 문서 패턴의 완전한 구현은 https://java-design-patterns.com/patterns/abstract-document/에서 확인할 수 있다. 여기 곧 주요 수업들이 있다.

Document.

공중의 접점 문서 {     오브젝트 놓다( 핵심을, 오브젝트 가치를 매기다);     오브젝트 얻다( 핵심을);     <T> 스트림<T> 아이들.(              핵심을, 함수<지도<, 오브젝트>, T> 건설업자);     ); } 

BaseDocument.java

공중의 추상적 계급 추상 문서 기구들 문서 {     사유의 최종의 지도<, 오브젝트> 특성.;     보호받는 추상 문서(지도<, 오브젝트> 특성.) {         물건들.NonNull 필요(특성., "필요한 지도");         .특성. = 특성.;     }     @오버라이드     공중의 보이드 놓다( 핵심을, 오브젝트 가치를 매기다) {         특성..놓다(핵심을, 가치를 매기다);         돌아오다 무효의;     }     @오버라이드     공중의 오브젝트 얻다( 핵심을) {         돌아오다 특성..얻다(핵심을);     }         @오버라이드     공중의 <T> 스트림<T> 아이들.( 핵심을, 함수<지도<, 오브젝트>, T> 건설업자) {         돌아오다 스트림.불가해한(얻다(핵심을))                 .여과하다(물건들::논널)                 .지도를 그리다(엘을 -> (리스트<지도<, 오브젝트>>) 엘을)                 .아무거나 찾다()                 .물줄기가 흐르다()                 .플랫맵(컬렉션::물줄기가 흐르다)                 .지도를 그리다(건설업자);   } } 

Usage.java

시합을 하다 카프로퍼티 = ...; 시합을 하다 자동차 = 새로운 자동차(카프로퍼티);  본을 뜨다 = 자동차.겟모델().오렐스 던지기()); 인트로 값을 매기다 = 자동차.getPrice().오렐스 던지기()); 시합을 하다 부품. = 자동차.getParts(); 

참조

  1. ^ Forslund, Emil (2016-01-15). "Age of Java: The Best of Both Worlds". Ageofjava.blogspot.com. Archived from the original on 2016-01-18. Retrieved 2016-01-23.
  2. ^ Fowler, Martin. "Dealing with Properties" (PDF). Retrieved 2016-01-29.