디자인 모델 원칙 - 반전 의존 (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. 자바 에서 구체 적 이거 나 세부 적 인 것 은 일반적으로 실현 류 를 가리킨다.↩

좋은 웹페이지 즐겨찾기