热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式六大原则(四):接口隔离原则(InterfaceSegregationPrinciple)

接口隔离原则(ISP)定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和

接口隔离原则(ISP)定义:

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

 
问题由来:

类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

 

解决方案:

将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

 

举例来说明接口隔离原则:

A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。

C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现。

对于类B和类D来说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但由于实现了接口I,所以也必须要实现这些用不到的方法。

 

code:

public interface I
    {
        void One();
        void Two();
        void Three();
        void Four();
        void Five();
    }
 public class B : I
    {
        public void One()
        {
            Console.WriteLine("实现了");
        }

        public void Two()
        {
            Console.WriteLine("实现了");
        }

        public void Three()
        {
            Console.WriteLine("实现了");
        }

        public void Four()
        {
        }

        public void Five()
        {

        }
        
    }
 public class D : I
    {
        public void One()
        {
            Console.WriteLine("实现了");
        }

        public void Two()
        {
        }

        public void Three()
        {
        }

        public void Four()
        {
            Console.WriteLine("实现了");
        }

        public void Five()
        {
            Console.WriteLine("实现了");
        }
    }

可以看到,如果接口过于臃肿,只要接口中出现的方法,不管对依赖于它的类有没有用处,实现类中都必须去实现这些方法,

这显然不是好的设计。如果将这个设计修改为符合接口隔离原则,就必须对接口I进行拆分。在这里我们将原有的接口I拆分为三个接口,拆分后的设计如图所示:

相对应的代码Code:

 public interface I1
    {
        void One();
    }

    public interface I2
    {
        void Two();
        void Three();
       
    }

    public interface I3
    {
        void Four();
        void Five();
    }
 public class B : I1,I2
    {
        public void One()
        {
            Console.WriteLine("实现了");
        }

        public void Two()
        {
            Console.WriteLine("实现了");
        }

        public void Three()
        {
            Console.WriteLine("实现了");
        }
    }
 public class D : I1,I3
    {
        public void One()
        {
            Console.WriteLine("实现了");
        }
        
        public void Four()
        {
            Console.WriteLine("实现了");
        }

        public void Five()
        {
            Console.WriteLine("实现了");
        }
    }

接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。

也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

上面例子中,将一个庞大的接口变更为3个专用的接口所采用的就是接口隔离原则。在

程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。

接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

 

采用接口隔离原则对接口进行约束时,要注意以下几点:

  • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
  • 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些时间去思考和筹划,才能准确地实践这一原则。


推荐阅读
  • 我们使用例如ActionListener的接口时,自己把那些函数定义了就行了。但是我不清楚是谁来调用这个函数呢?例如我自己定义一个接口:publicinterfaceMyInterfa ... [详细]
  • 由于工作需要,接手别人用bpel写的工作流程序,一点都不懂就到网上找到一篇入门的文章,觉得这篇不错,就copy下来并添加了读书笔计以红字标记,感激写此文章的人.许多开发人员觉得BPEL很神秘,不知道 ... [详细]
  • 新增和更新价目表行--目的:在已有的价目表头基础上,增加行信息--限制:该api有些问题,如果强制增加头信息,会有很多问题,所以该例子只是在已有头信息基础上,增加行信息 ... [详细]
  • 背景1.结构体1.1depSet和finalCloserdepSet:记录db与conn之间的依赖关系,维持连接池以及关闭时使用finalCloser:TododepSetisaf ... [详细]
  • 概要Clientsshouldnotbeforcedtodependuponinterfacesthattheydonotuse.不能强迫用户去依赖那些他们不使用的接 ... [详细]
  • (MSOA)微型面向服务的架构的设计与实现
    设计目的:1、系统按照功能或者业务逻辑层次划分服务,系统架构清晰、灵活;2、提供服务自动注册;3、服务调用简单,服务之间的调用可以通过getXXXService()直接获得;4、服务统一管理;5、服务 ... [详细]
  • 本文汇总了在正式宴会上常用的寒暄语句,包括欢迎词、感谢词及日常问候,适用于各种正式场合。这些语句不仅有助于提升交际礼仪,还能增进彼此之间的友好关系。 ... [详细]
  • 发现《iphone3开发基础教程》中大部分说的是xib的模板,直接学习中用StoryBoard碰到很多问题,在现有阶段要花很多时间来找度娘聊天,故决定,在这次学习过程中先以xib为主,在自学完后 ... [详细]
  • 首先使用下面的命令查询要卸载的文件名:dkpg-l然后再通过下面的命令卸载:dkpg-r*比如我们要卸载google的chrome浏览器:首先执行dkpg-l:root@lqm:homel ... [详细]
  • GPIO实现I2C从机的设计[2]
    在上篇文章中,实现了GPIO模拟I2C从机的初步设计,但在实际的使用过程中,发现了一些问题,为了解决实际传输过程中发生的数据传输错误问题,在本篇文章中,会根据实际测试情况对上篇的代码做一些修改。 ... [详细]
  • Use从句的语法一、Use从句列出了所有使用到的单元的名称(不是源文件的名称)。Use从句出现在以下位置:-->.dpr文件的工程名称之后。-->.pas文 ... [详细]
  • Java动态代理的应用
    MathJax.Hub.Config({showMathMenu:false}); ... [详细]
  • 长话短说,尝试利用Google的良好做法。我为Di计划使用Dagger2犯了一个错误。现在我被 ... [详细]
  • 关于母版页的按钮事件
    参考:http:topic.csdn.netu201203091396d8c42f-6bcc-4acf-89e7-8015cac777ba.html?37024解决这个问题, ... [详细]
  • 基于FPGA的串口通讯设计
    这个小项目是在2013年初学FPGA时所做的,现把当时的设计笔记贴出来。RS232C电气规定EIA-RS-232C对电气特定、逻辑电平和各信号线功能都做了相关规定。在此部分,只简单 ... [详细]
author-avatar
xjoliemonicane_934
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有