>Java >java지도 시간 >Java의 종속성 반전 원칙의 자세한 예

Java의 종속성 반전 원칙의 자세한 예

黄舟
黄舟원래의
2017-08-11 10:12:091845검색

이 글에서는 주로 Java 종속성 역전 원리의 정의와 문제 해결 방법을 소개합니다. 관심 있는 친구들은 함께 살펴보세요

정의: 고위 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 의존해야 합니다. 추상화에 의존하세요. 세부 사항은 추상화에 의존해야 합니다.

문제의 원인: 클래스 A가 클래스 B에 직접 종속됩니다. 클래스 A를 클래스 C에 종속되도록 변경하려면 클래스 A의 코드를 수정해야 합니다. 이 시나리오에서 클래스 A는 일반적으로 복잡한 비즈니스 논리를 담당하는 상위 수준 모듈이고, 클래스 B와 C는 기본 원자성 작업을 담당하는 하위 수준 모듈입니다. 클래스 A가 수정되면 프로그램에 불필요한 위험이 발생합니다.

해결책: 클래스 A를 수정하여 인터페이스 I에 종속되도록 합니다. 클래스 B와 클래스 C는 각각 인터페이스 I을 구현합니다. 클래스 A는 인터페이스 I를 통해 클래스 B 또는 클래스 C에 간접적으로 연결되므로 클래스 A를 수정할 가능성이 크게 줄어듭니다. .基 반전의 원리는 세부 사항의 가변성에 비해 추상적인 것이 훨씬 더 안정적이라는 사실에 기초합니다. 추상화를 기반으로 구축된 아키텍처는 세부 사항을 기반으로 구축된 아키텍처보다 훨씬 안정적입니다. Java에서 추상화는 인터페이스 또는 추상 클래스를 나타내며 세부 사항은 특정 구현 클래스를 의미합니다. 인터페이스 또는 추상 클래스를 사용하는 목적은 특정 작업을 포함하지 않고 사양 및 계약을 공식화하고 세부 사항을 구현 클래스에 표시하는 작업을 맡기는 것입니다. 완벽한.


종속성 반전 원칙의 핵심 아이디어는 인터페이스 지향 프로그래밍입니다. 우리는 인터페이스 지향 프로그래밍이 구현 지향 프로그래밍보다 어떻게 더 나은지 설명하기 위해 여전히 예를 사용합니다. 그 장면은 이렇습니다. 엄마가 아이에게 책을 주기만 하면 그 책에 따라 아이에게 이야기를 들려줄 수 있습니다. 코드는 다음과 같습니다.

class Book{ 
 public String getContent(){ 
  return "很久很久以前有一个阿拉伯的故事……"; 
 } 
} 
class Mother{ 
 public void narrate(Book book){ 
  System.out.println("妈妈开始讲故事"); 
  System.out.println(book.getContent()); 
 } 
} 
public class Client{ 
 public static void main(String[] args){ 
  Mother mother = new Mother(); 
  mother.narrate(new Book()); 
 } 
}

실행 결과:

엄마가 이야기를 시작했습니다

오래전에 아랍 이야기가 있었는데...

잘 돌아가면. 요구는 다음과 같이 됩니다: Not for 책은 신문에 대신 주어졌고, 어머니는 신문에 그 이야기를 하도록 요청받았습니다:

class Newspaper{ 
 public String getContent(){ 
  return "林书豪38+7领导尼克斯击败湖人……"; 
 } 
}

이 어머니는 할 수 없었습니다. 신문에서 기사를 읽을 수 없었기 때문입니다. 책을 신문으로 바꾸면 되는데, 어머니가 그것을 읽으려면 수정을 해야 합니다. 나중에 잡지로 전환해야 한다면 어떻게 해야 하나요? 웹페이지로 대체하면 어떨까요? Mother를 지속적으로 수정해야 하는데 이는 분명히 좋은 디자인이 아닙니다. 그 이유는 어머니와 책의 결합도가 너무 높아서 둘 사이의 결합도를 줄여야 하기 때문입니다.


추상 인터페이스 IReader를 소개합니다. 단어가 있는 한 읽기는 읽기입니다.

interface IReader{ 
 public String getContent(); 
} 
Mother类与接口IReader发生依赖关系,而Book和Newspaper都属于读物的范畴,他们各自都去实现IReader接口,这样就符合依赖倒置原则了,代码修改为:
class Newspaper implements IReader { 
 public String getContent(){ 
  return "林书豪17+9助尼克斯击败老鹰……"; 
 } 
} 
class Book implements IReader{ 
 public String getContent(){ 
  return "很久很久以前有一个阿拉伯的故事……"; 
 } 
} 
class Mother{ 
 public void narrate(IReader reader){ 
  System.out.println("妈妈开始讲故事"); 
  System.out.println(reader.getContent()); 
 } 
} 
public class Client{ 
 public static void main(String[] args){ 
  Mother mother = new Mother(); 
  mother.narrate(new Book()); 
  mother.narrate(new Newspaper()); 
 } 
}

실행 결과:

엄마가 이야기를 하기 시작했습니다

오래 전에 아랍어 이야기가 있었습니다...엄마가 이야기를 하기 시작했습니다

Jeremy Lin 17+ 9는 Knicks가 Hawks를 물리치는 데 도움을 주었습니다...


이 수정 후에는 향후 Client 클래스를 어떻게 확장하더라도 더 이상 Mother 클래스를 수정할 필요가 없습니다. 이는 단순한 예일 뿐이며, 실제 상황에서는 상위 모듈을 대표하는 Mother 클래스가 주요 비즈니스 로직을 완성하는 역할을 담당하게 되며, 일단 수정이 필요하면 오류가 발생할 위험이 매우 높습니다. 따라서 종속성 역전 원칙을 따르면 클래스 간의 결합을 줄이고, 시스템의 안정성을 향상시키며, 프로그램 수정으로 인한 위험을 줄일 수 있습니다.


종속성 반전 원칙을 채택하면 다중 사용자 병렬 개발에 큰 편의성이 제공됩니다. 예를 들어 위의 예에서 Mother 클래스와 Book 클래스가 직접 결합된 경우 Mother 클래스는 Book 클래스가 완료될 때까지 기다려야 합니다. Mother 클래스는 Book 클래스에 의존하기 때문에 코딩하기 전에 코딩해야 합니다. Mother 클래스와 Book 클래스는 서로 아무런 관련이 없기 때문에 수정된 프로그램은 서로 영향을 주지 않고 동시에 시작할 수 있습니다. 공동 개발에 참여하는 사람이 많아지고 프로젝트 규모가 커질수록 종속성 유발 원칙을 채택하는 것이 더 중요해집니다. 현재 인기 있는 TDD 개발 모델은 종속성 반전 원칙을 가장 성공적으로 적용한 모델입니다.


위 예제에서 사용한 방법은 인터페이스 전달 방법이 있는데 생성자 방법 전달과 setter 방법 전달이 있습니다. 종속성 전송 방법에 대해 낯설지 않습니다.

실제 프로그래밍에서는 일반적으로 다음 세 가지 사항을 수행해야 합니다.


    저수준 모듈에는 추상 클래스나 인터페이스 또는 둘 다가 있어야 합니다.
  • 변수의 선언형은 최대한 추상 클래스나 인터페이스여야 합니다.
  • 상속을 사용할 때는 Liskov 대체 원칙을 따르세요.
  • 종속성 반전 원칙의 핵심은 인터페이스 지향 프로그래밍을 이해하면 종속성 반전도 이해한다는 것입니다.

위 내용은 Java의 종속성 반전 원칙의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.