어댑터 모드
어댑터 패턴 정의 (영어 : 어댑터 패턴)를 포장 스타일 또는 포장이라고합니다. 클래스의 인터페이스를 사용자가 기대하는 것으로 전송하십시오. 적응은 인터페이스 비 호환성으로 인해 함께 작동 할 수없는 클래스를 만듭니다.
어댑터 모드에는 두 가지 유형이 있습니다.
1. 객체 어댑터 모드 - 객체 어댑터는 연관성을 통한 사용자의 기대 인터페이스를 충족시키고 코드 간의 잘못된 커플 링을 줄입니다. 작업에서 "객체 적응"을 사용하는 것이 좋습니다.
2. 클래스 어댑터 모드 -이 어댑터 모드에서 어댑터는 구현 된 클래스 (일반적으로 다중 상속)를 상속합니다. Java에는 여러 상속이 없으므로 여기에 소개하지 않을 것입니다.
성취하다
1. 대상 - 클라이언트가 사용해야하는 방법을 정의합니다.
2. 어댑터 - 대상을 물려 받거나 구현하고 적응기 방법에 적응할 수 있습니다.
3. Adaptee- 기존 방법을 정의합니다.
4. 클라이언트 - 대상의 통화 방법.
Public Class Adaptee {public void incipleRequest () {System.out.println ( "안녕하세요, Adaptee 출신입니다!"); }} 공개 인터페이스 대상 {public void request (); } 공공 클래스 어댑터는 대상을 구현합니다 {Adaptee adaptee; 공개 어댑터 () {adaptee = new adaptee (); } public void request () {adaptee.specificrequest (); }} public class client {public static void main (String [] args) {target target = new 어댑터 (); 대상 .request (); }}클래스 어댑터 패턴을 구현하려면 어댑터를 상속하기 위해 어댑터가 필요합니다.
해당 시나리오
1. 이전 클래스를 사용하려고하고 인터페이스가 필요에 맞지 않으면 어댑터 클래스를 중재 클래스로 사용할 수 있습니다.
2. 당신은 당신이 사용할 수있는 일부 관련 클래스 인터페이스를 호출 할 수있는 일반 목적 수업을 만들고자합니다.
브리지 모드
동기 부여 때때로 초록은 다른 구현을 가져야합니다. 예를 들어, 데이터를 저장하는 두 가지 방법이 있습니다. 하나는 파일 메소드이고 다른 하나는 데이터베이스 메소드입니다. 일반적인 관행은 데이터를 저장하는 클래스를 물려받은 다음 데이터를 저장하는 다른 방법을 구현하는 것입니다. 이것의 문제점은 저장 메소드를 수정하고 확장하기가 어렵고 런타임에서 저장 메소드를 전환 할 수 없다는 것입니다.
브리지 패턴을 정의하는 것은 소프트웨어 디자인 패턴에서 가장 복잡한 패턴 중 하나이며, 이는 구현 부품의 추상 부분을 구현 부품과 분리시켜 독립적으로 변경할 수 있습니다.
예를 들어, "원"과 "삼각형"은 추상적 인 "모양"으로 분류되는 반면 "그리기 원"과 "드로잉 삼각형"은 동작을 실현하는 "그리기"범주로 분류되며 "도면"은 "모양"으로 호출됩니다.
1. 초록 - 초록 방법을 정의하십시오.
2. AbstractImpl- 구현 인터페이스를 사용하여 추상 방법을 구현합니다.
3. 구현 자 - 특정 구현 동작의 인터페이스를 정의합니다.
4. CONCRETEIMPLEMENTOR1, CONCRETEIMPLEMENTOR2- 구현 자 인터페이스 구현.
/ ** "구현 자"*/ 인터페이스 DrawingApi {public void DrawCircle (Double X, Double Y, Double Radius); }/** "ConcreteImplementor"1/2*/Class DrawingApi1 DrawingApi {public void DrawCircle (Double X, Double y, Double Radius) {System.out.printf ( "Api1.Circle at %f : %f Radius %f/n", x, radius); }}/** "ConcreteImplementor"2/2*/Class DrawingApi2 DrawingApi {public void DrawCircle (Double X, Double y, Double Radius) {System.out.printf ( "Api2.circle at %f : %f Radius %f/n", x, radius); }} / ** "추상화"* / 인터페이스 모양 {public void draw (); // 저수준의 공개 void resizeBypercentage (Double PCT); // High-Level}/ ** "정제 된 추상화"*/ 클래스 CircleShape 구현 모양 {private double x, y, radius; 개인 Drawapi Drawingapi; public circleShape (Double X, Double Y, Double Radius, Drawapi DrawingApi) {this.x = x; this.y = y; this.radius = 반경; this.drawingapi = drawingapi; } // 저수준 IE 구현 특정 공개 void draw () {DrawingApi.DrawCircle (X, Y, RADIUS); } // 하이 레벨 IE 추상적 인 특정 공개 void resizeBypercentage (double pct) {radius *= pct; }} / ** "클라이언트"* / Class BridgePattern {public static void main (String [] args) {shape [] shapes = new Shape [2]; 모양 [0] = New Circleshape (1, 2, 3, New Drawapi1 ()); 모양 [1] = 새로운 CircleShape (5, 7, 11, 새로운 Drawapi2 ()); for (shape shape : shapes) {shape.resizebypercentage (2.5); shape.draw (); }}} 예
1. 동기 부여에 언급 된 데이터를 저장하십시오.
2. 그래픽의 그리기 프레임. 위 코드의 구현과 유사합니다.
해당 시나리오
1. 추상화와 구현이 고정 관계를 갖기를 원하지 않지만 런타임에 구현을 수정할 수 있기를 바랍니다.
2. 추상 및 구현 부품은 서로 영향을 미치지 않고 독립적으로 확장 될 수 있습니다.