어떠한 클라이언트도 사용하지 않는 방법에 의존하도록 강요해서는 안 됩니다
다양한 출력 장치를 객체로 표현한 사무실 공간의 예를 생각해 보세요
인터페이스 분리 원칙 전:
다기능 인터페이스
/** * @ImultiFunction interface has methods related to all output devices present in office space * for devices like Printer, Scanner, Fax machines, etc */ public interface IMultiFunction { public void print(); public void getPrintSpoolDetails(); public void scan(); public void scanPhoto(); public void fax(); public void internetFax(); }
위의 공통 인터페이스를 다양한 디바이스에 구현합니다
모든 기능을 갖춘 XeroxWorkCenter 클래스
/** * * You must have seen Xerox work station device which has all the features in one like printing, scanning, xerox, * fax etc */ public class XeroxWorkCenter implements IMultiFunction { @Override public void print() { // real printing code } @Override public void getPrintSpoolDetails() { // real get print spool details code } @Override public void scan() { // read scanning code } @Override public void scanPhoto() { // real scan photo code } @Override public void fax() { // real fax code } @Override public void internetFax() { // real internet fax code } }
HpPrinterNScanner 클래스에는 인쇄 및 스캔 기능이 있습니다
public class HpPrinterNScanner implements IMultiFunction { @Override public void print() { // real printing code } @Override public void getPrintSpoolDetails() { // real get print spool details code } @Override public void scan() { // read scanning code } @Override public void scanPhoto() { // real scan photo code } //Since HpPrinterNScanner has only printing and scanning abilities fax() and internetFax() will have empty body @Override public void fax() {} @Override public void internetFax() {} }
CanonPrinter 클래스에는 인쇄 기능만 있습니다
public class CanonPrinter implements IMultiFunction { @Override public void print() { // real printing code } @Override public void getPrintSpoolDetails() { // real get print spool details code } //Since the CanonPrinter has only printing ability rest of the method will have an empty body @Override public void scan() {} @Override public void scanPhoto() {} @Override public void fax() {} @Override public void internetFax() {} }
ISP 위반 식별 기법
인터페이스 분리 후 원칙:
public interface IPrint { public void print(); public void getPrintSpoolDetails(); }
public interface IScan { public void scan(); public void scanPhoto(); }
public interface IFax { public void fax(); public void internetFax(); }
/** * * You must have seen the Xerox workstation device which has all the features in one like printing, scanning, xerox, fax, etc. */ public class XeroxWorkCenter implements IPrint,IScan,IFax { @Override public void print() { // real printing code } @Override public void getPrintSpoolDetails() { // real get print spool details code } @Override public void scan() { // read scanning code } @Override public void scanPhoto() { // real scan photo code ̰ } @Override public void fax() { // real fax code } @Override public void internetFax() { // real internet fax code } }
public class HpPrinterNScanner implements IPrint,IScan { @Override public void print() { // real printing code } @Override public void getPrintSpoolDetails() { // real get print spool details code } @Override public void scan() { // read scanning code } @Override public void scanPhoto() { // real scan photo code } }
public class CanonPrinter implements IPrint { @Override public void print() { // real printing code } @Override public void getPrintSpoolDetails() { // real get print spool details code } }
각 인터페이스에는 단일 책임이 있으며 이제 훨씬 더 깔끔해졌습니다.
ISP와 다른 SOLID 원칙과의 관계
단일 책임
인터페이스를 다른 인터페이스로 분리한 후 이제 IPrint, IScan과 같은 모든 인터페이스는 단일 책임을 갖습니다
리스코프 대체
분리로 인해 이제 모든 클래스(인터페이스 구현)가 Liskov 대체를 따릅니다. 모든 하위 유형 또는 구현 클래스가 해당 인터페이스 참조 변수로 대체될 수 있기 때문입니다.
위 내용은 인터페이스 분리 원칙의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!