💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
**接口隔离原则**:每一个接口只负责一种角色(干一件事)。 * 客户端不应该依赖它不需要的接口 * 类间的依赖关系应该建立在最小的接口上 >[danger]接口隔离原则和单一职责原则的审视角度是不同的,单一职责原则要求类和接口职责单一,注重的是职责,是业务逻辑上的划分,而接口隔离原则要求方法要尽可能的少,是在接口设计上的考虑。例如一个接口的职责包含10个方法,这10个方法都放在一个接口中,并且提供给多个模块访问,各个模块按照规定的权限来访问,并规定了“不使用的方法不能访问”,这样的设计是不符合接口隔离原则的,接口隔离原则要求“尽量使用多个专门的接口”,这里专门的接口就是指提供给每个模块的都应该是单一接口(即每一个模块对应一个接口),而不是建立一个庞大臃肿的接口来容纳所有的客户端访问 没有哪个设计可以十全十美的考虑到所有的设计原则:**根据接口隔离原则拆分接口时,首先必须满足单一职责原则** 它要求客户端不应该依赖于它不需要的接口。换句话说,一个类不应该强迫它的客户端实现它们不需要的接口方法。 下面通过一个简单的 PHP 示例来说明接口隔离原则: ~~~ interface Printer { public function print(); } interface Scanner { public function scan(); } interface FaxMachine { public function fax(); } class AllInOnePrinter implements Printer, Scanner, FaxMachine { public function print() { // 打印的逻辑 } public function scan() { // 扫描的逻辑 } public function fax() { // 传真的逻辑 } } class SimplePrinter implements Printer { public function print() { // 打印的逻辑 } } class PhotoCopier implements Printer, Scanner { public function print() { // 打印的逻辑 } public function scan() { // 扫描的逻辑 } } ~~~ 在上面的示例中,我们有三个接口 `Printer`、`Scanner` 和 `FaxMachine`,它们分别定义了打印、扫描和传真的方法。`AllInOnePrinter` 类实现了所有三个接口,表示它具备打印、扫描和传真的功能。`SimplePrinter` 类只实现了 `Printer` 接口,表示它只具备打印的功能。`PhotoCopier` 类实现了 `Printer` 和 `Scanner` 接口,表示它具备打印和扫描的功能。 通过接口隔离原则,我们将功能拆分为多个小接口,每个接口只包含一个特定的功能。这样,客户端就可以根据需要选择性地依赖于这些接口,而不必强制实现不需要的方法。这提高了代码的灵活性和可维护性,使得系统更加可扩展和可复用。 总之,接口隔离原则要求客户端不应该依赖于它们不需要的接口。通过拆分大接口为小接口,我们可以减少类之间的耦合度,增强代码的灵活性和可维护性。 ``` // 做布娃娃的小作坊,工序有给布娃娃扎辫子、穿衣服、包装入箱、打标签 interface Work { public function hairBraiding(); public function getDressed(); public function packingIntoTheBox(); public function makeTag(); } // 王大妈被分配去给布娃娃穿衣服 class WangMather2 implements Work{ /* * @Override * 扎辫子 * */ public function hairBraiding() {} /* * @Override * 穿衣服 * */ public function getDressed() { echo "王大妈给布娃娃穿衣服"; } /* * @Override * 包装入箱 * */ public function packingIntoTheBox() {} /* * @Override * 打标签 * */ public function makeTag() {} } // 李大姨被分配去给布娃娃扎辫子 class LiAunt2 implements Work { /* * @Override * 扎辫子 * */ public void hairBraiding() { echo "李大姨给布娃娃扎辫子"; } /* * @Override * 穿衣服 * */ public void getDressed() {} /* * @Override * 包装入箱 * */ public void packingIntoTheBox() {} /* * @Override * 打标签 * */ public void makeTag() {} } // 李大姨被分配去给布娃娃扎辫子,王大妈被分配去给布娃娃穿衣服,但是却都要实现其他 3 个多余的接口 // 符合接口隔离的工作流程是,单独 /** * 扎辫子 */ interface Hair { public function hairBraiding(); } /** * 穿衣服 */ interface Dress { public function getDressed(); } /** * 包装入箱 */ interface Box { public function packingIntoTheBox(); } /** * 打标签 */ interface Tag { public function makeTag(); } /** * 李大姨给布娃娃扎辫子快 */ class LiAunt3 implements Hair { /* * @Override * 扎辫子 * */ public void hairBraiding() { echo "李大姨给布娃娃扎辫子"; } } /** * 王大妈给布娃娃穿衣服快 */ class WangMather3 implements Dress{ /* * @Override * 穿衣服 * */ public void getDressed() { echo "王大妈给布娃娃穿衣服"; } } /** * 陈大叔包装快 */ class ChenUncle implements Box { /* * @Override * 装箱 * */ public void packingIntoTheBox() { echo "陈大叔给布娃娃装箱"; } } /** * 黄大姐贴标签快 */ class HuangSister implements Tag { /* * @Override * 打标签 * */de public void makeTag() { echo "黄大姐给箱子打标签"; } } // 测试代码 $liAunt3 = new LiAunt3(); $wangMather3 = new WangMather3(); $chenUncle = new ChenUncle(); $huangSister = new HuangSister(); $liAunt3->hairBraiding(); $wangMather3->getDressed(); $chenUncle->packingIntoTheBox(); $huangSister->makeTag(); ```