任何客户端都不应该被迫依赖它不使用的方法

考虑办公空间的示例,其中使用对象表示各种输出设备

接口隔离原则之前:

i多功能接口

/**

  • @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)都有单一职责

里氏替换
由于隔离,现在所有类(实现接口)都遵循里氏替换,因为所有子类型或实现类都可以用它们的接口引用变量替换

    以上就是接口隔离原则的详细内容,更多请关注php中文网其它相关文章!