디자인 모델 원칙 - 반전 의존 (Dependency Inversion Principle, DIP)
     ,       。    ,   。
정의.
4. 567917. 고 층 모듈 은 바 텀 모듈 에 의존 해 서 는 안 되 고 모두 추상 [1] 에 의존 해 야 한다
4. 567917. 추상 은 구체 적 인 [2] 에 의존 하지 말고 구체 적 으로 추상 에 의존 해 야 한다
문제 의 유래
클래스 A 는 클래스 B 에 직접 의존 합 니 다. 클래스 A 를 의존 클래스 C 로 바 꾸 려 면 클래스 A 의 코드 를 수정 하여 이 루어 져 야 합 니 다.이런 장면 에서 류 A 는 보통 고 층 모듈 로 복잡 한 업무 논 리 를 책임 진다.클래스 B 와 클래스 C 는 저층 모듈 로 기본 적 인 원자 조작 을 책임 집 니 다.클래스 A 를 수정 하면 프로그램 에 불필요 한 위험 을 가 져 올 수 있 습 니 다.
거꾸로 의존 하 는 것 은 세 가지 방식 으로 이 루어 진다.
4. 567917. 구조 함 수 를 통 해 의존 대상 을 전달한다.예 를 들 어 구조 함수 에서 전달 해 야 할 매개 변 수 는 추상 류 나 인터페이스의 방식 으로 이 루어 진다
4. 567917. setter 방법 으로 의존 대상 을 전달 합 니 다.즉, 우리 가 설정 한 set XXX 방법 에서 의 매개 변 수 는 추상 류 나 인터페이스 로 전달 의존 대상 을 실현 하 는 것 이다
4. 567917. 인터페이스 성명 은 의존 대상 을 실현 하고 인터페이스 주입 이 라 고도 부른다.즉, 함수 성명 에서 매개 변 수 는 추상 류 나 인터페이스 로 전달 의존 대상 을 실현 하고 의존 대상 을 직접 사용 하 는 목적 을 달성 하 는 것 이다
자바 예
1. 여러 곳 에서 인용 한 개인 적 인 생각 도 대표 적 인 예 가 있다. 회 사 는 포드 와 혼 다 의 금메달 파트너 이다. 현 재 는 자동차 에 이 시스템 을 설치 하면 무인 운전 을 할 수 있 는 자율 주 행 시스템 을 개발 하 라 고 요구 하고 있다. 이 시스템 은 포드 와 혼 다 차 에서 사용 할 수 있 고 이 두 브랜드 의 자동차 가 이 시스템 을 사용 하면 자동 운전 을 할 수 있다.
/**
 *     
 */
public interface ICar {
    void run();
    void stop();
}
/**
 *       
 */
public class AutoCarSystem {
    //                ,                   
    private ICar car = null;
    public AutoCarSystem(ICar car) {
        this.car = car;
    }
    public void setCar(ICar car) {
        this.car = car;
    }
    public void carRun() {
        car.run();
    }
    public void carStop() {
        car.stop();
    }
}
/**
 * Fute           
 */
public class FuteCar implements ICar {
    @Override
    public void run() {
        System.out.println("FuteCar run");
    }
    @Override
    public void stop() {
        System.out.println("FuteCar stop");
    }
}
/**
 * Benz           
 */
public class BenzCar implements ICar {
    @Override
    public void run() {
        System.out.println("BenzCar run");
    }
    @Override
    public void stop() {
        System.out.println("BenzCar stop");
    }
}
데모 호출
public class TestDemo {
    public static void main(String[] args) {
        FuteCar futeCar = new FuteCar();
        BenzCar benzCar = new BenzCar();
        //           ,        
        //   futeCar
        AutoCarSystem autoCarSystem = new AutoCarSystem(futeCar);
        autoCarSystem.carRun();
        autoCarSystem.carStop();    
        //  benzCar
        autoCarSystem.setCar(benzCar);
        autoCarSystem.carRun();
        autoCarSystem.carStop();
        //                       ,   ICar         ,               ,                   。      ,    。
    }
}
제어 단 출력 결과
FuteCar run
FuteCar stop
BenzCar run
BenzCar stop
2. 다시 예 를 들 어 사람 이 책 을 읽 고 한 사람 이 많은 책 을 읽 을 수 있다.
/**
 *     
 */
public interface IBook {
    //    
    String title();
    //    
    String content();
}
/**
 *    
 *         ,            
 */
public class PeopleReadBook {
    private IBook book = null;
    public PeopleReadBook(IBook book) {
        this.book = book;
    }
    public void setBook(IBook book) {
        this.book = book;
    }
    public void readTitle() {
        System.out.println("  :" + book.title());
    }
    public void readContent() {
        System.out.println("  :" + book.content());
    }
}
/**
 * Java        
 */
public class JavaBook implements IBook {
    @Override
    public String title() {
        return "Java      ";
    }
    @Override
    public String content() {
        return "  Java,     ";
    }
}
/**
 * C        
 */
public class CBook implements IBook {
    @Override
    public String title() {
        return "C      ";
    }
    @Override
    public String content() {
        return "  C,     ";
    }
}
데모 호출
public class TestDemo {
    public static void main(String[] args) {
        JavaBook javaBook = new JavaBook();
        CBook cBook = new CBook();
        
        PeopleReadBook peopleReadBook = new PeopleReadBook(javaBook);
        peopleReadBook.readTitle();
        peopleReadBook.readContent();
        
        peopleReadBook.setBook(cBook);
        peopleReadBook.readTitle();
        peopleReadBook.readContent();
    }
}
제어 단 출력 결과
  :Java      
  :  Java,     
  :C      
  :  C,     
레 퍼 런 스
JAVA 설계 원칙 의 의존 도 원칙 설계 모델 6 대 원칙 (3): 의존 도 원칙 설계 원칙 (4) 의존 도 원칙 (DIP) 설계 모델 6 대 원칙: 의존 도 원칙
4. 567917. 자바 에서 추상 은 일반적으로 자바 인터페이스 (interface) 나 추상 류 (abstract class) 를 말한다.↩
4. 567917. 자바 에서 구체 적 이거 나 세부 적 인 것 은 일반적으로 실현 류 를 가리킨다.↩
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.