4. 接口隔离原则(Interface Segregation Principle,ISP)

4.1 定义

(1)使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。类间的依赖关系应该建立在最小接口

(2)接口尽量细化,同时接口中的方法尽量少。每个接口中只包含一个客户端(如子模块或业务逻辑类)所需的方法即可,这种机制也称为“定制服务”,即为不同的客户端提供宽窄不同的接口。

(3)为接口添加了不必要的方法,这叫接口污染。这对于实现类来讲,就是一种污染,他们会被迫去实现这些不必要的功能方法。并且当接口发生改变时,他们也不得不跟着改变。

4.2 接口隔离原则和单一职责原则的区别

(1)单一职责注意的是职责,是从业务逻辑上划分的。而接口隔离要求接口要尽量少。如有一个向外提供查询服务的,但提供的接口很多,有普通权限和高级权限的查询方法。这按单一职责原则是允许的,只提供单一职责,即查询。但按照接口隔离原则是不允许的。应按权限提供专门的接口给不同权限的客户端。

(2)接口隔离原则讲的就是同一个角色提供宽、窄不同的接口,以对付不同的客户端。

4.3 使用接口原则的注意事项

(1)接口尽量小,但要有限度。对接口进行细行可以提高设计灵活性,但如果过小,则会造成接口数量过多,使设计模式复杂化

(2)为依赖接口的类定制服务,只暴露给调用它的类所需要的方法,不需要的则隐藏起来。

(3)提高内聚,减少对外交互。使接口用最小的方法去完成最多的事情。具体要求就是,在接口中尽量少提供public方法,接口是对外的承诺,承诺地越少对系统开发越有利,变更的风险也就越少,同时也有利于降低成本。

【编程实验】接口隔离的例子

  ①Manager类代表管理工人的管理者。

  ②有两类工人,普通和高效的,他们都需要吃饭和工作

  ③如果这里来了一个机器人(Robot),如果保持现有设计,让Robot去实现IWork接口,就会被迫去实现吃饭的功能,这种情况下IWorker被认为是一个被污染了的接口。需重构,细化出3个接口,一个IWorkable(工作)、IFeedable(吃饭)和IRechargeable(充电)。

  ④工人类去实现IWorkable和IFeedable接口。Robot只实现IWorkable接口和 IRechargeable接口。

//当加入Robot类后,一个被污染的接口设计

//重构后符合接口隔离原则的设计

//面向对象设计原则:ISP接口隔离原则
//细化接口 #include <stdio.h> //IWorkable接口:工作
class IWorkable
{
public:
virtual void work() = ;
}; //IFeedable接口:吃饭
class IFeedable
{
public:
virtual void eat() = ;
}; //IRechargeable接口:充电
class IRechargeable
{
public:
virtual void recharge() = ;
}; //CommonWorker类:普通工人
class CommonWorker : public IWorkable, public IFeedable
{
public:
void eat(){printf("Common Worker eat()...\n");}
void work(){printf("Common Worker work()...\n");}
}; //EfficentWork类:高效工人
class EfficentWork : public IWorkable, public IFeedable
{
public:
void eat(){printf("Efficent Worker eat()....\n");}
void work(){printf("Efficent Worker work()...\n");}
}; //Robot类:机器人
class Robot : public IWorkable, public IRechargeable
{
public:
void recharge(){printf("Robot recharge()...\n");}
void work(){printf("Robot work()...\n");}
}; //Manager类:管理者
class Manager
{
private:
IWorkable* worker;
public:
void setWorker(IWorkable* w){worker = w;}
void manage(){worker->work();}
};
int main()
{ CommonWorker cmw;
EfficentWork efw;
Robot rb; Manager mn; //管理员让普通工人工作
mn.setWorker(&cmw);
mn.manage(); //管理员让高效工人工作
mn.setWorker(&efw);
mn.manage(); //管理员让机器人工作
mn.setWorker(&rb);
mn.manage(); return ;
}

4.4 最佳实践

(1)一个接口只服务于一个子模块或业务逻辑

(2)通过业务逻辑压缩接口中的public方法,以提高内聚

(3)己经被污染了的接口,尽量去修改,若变更的风险较大,则采用适配器模式进行转化。

第2章 面向对象的设计原则(SOLID):4_接口隔离原则(ISP)的更多相关文章

  1. C#软件设计——小话设计模式原则之:接口隔离原则ISP

    前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...

  2. 【设计模式六大原则4】接口隔离原则(Interface Segregation Principle)

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

  3. 【面向对象设计原则】之接口隔离原则(ISP)

    接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...

  4. 面象对象设计原则之四:接口隔离原则(The Interface Segregation Principle,ISP)

    接口隔离原则定义如下: 接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 根 ...

  5. 《设计模式》-原则四:接口隔离原则(ISP)

    啊!天气很热啊,回来洗个澡,做个饭吃完后 又出了一身汗,真后悔先洗澡. 加油坚持学习,今天要学的是“接口隔离原则” 意思是说:在设计的时候使用多个专门的接口比使用一个总的接口好很多.一个类对另一个类的 ...

  6. C# 实例解释面向对象编程中的接口隔离原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  7. Java设计原则—接口隔离原则(转)

    接口隔离原则 Interface Segregation Principle    定义: 客户端不应该依赖它不需要的接口 类间的依赖关系应该建立在最小的接口上 我们可以把这两个定义概括为一句话:建立 ...

  8. 面向对象的六大原则之 接口隔离原则——ISP

    ISP = Interface Segregation Principle   ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应 ...

  9. 设计模式原则(4)--Interface Segregation Principle(ISP)--接口隔离原则

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.定义: 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 2.使用场景: 类A ...

随机推荐

  1. ruby on rails 2.3+的版本不再支持cgi

    ruby on rails 2.3+的版本不再支持cgi了,恶心到了,换其他框架,看了款cramp,完全没资料,完全不让人入门 操蛋的厉害,ruby果然是小众的窝里乐,放弃使用

  2. 公司mysql数据库设计与优化培训ppt

    cnblogs无法上传附件. http://pan.baidu.com/s/1kVGqMn9

  3. PHP程序z中xdebug工具简要使用方法

    PHP程序的debug PHP程序的debug,无论是cli方式还是web方式,都需要使用第三方的debug工具.PHP5.6之前,本身自带的debug功能,仅限于日志输出. 推荐使用免费xdebug ...

  4. gulp小记(无刷新重载样式)

    之前在使用sass的时候,使用了一个不错的工具koala,其实它的原理就是监视sass文件的变化,去编译css而gulp也能为我们做这样的事并且更多 使用gulp之前我们要做一些准备工作 1)安装no ...

  5. ASP.NET验证码生成与识别

    一般验证码页面只输出一个图片而不进行其他业务处理,所以验证码一般放在一般处理程序(httpHandler)页面中,而如果将验证码生成代码放到一般处理程序中,要将生成验证码保存在Session中,这里我 ...

  6. ASP.NET控件绑定数据源

    DataList/GridView/Repeater DataSet表示数据集,其中包含表,约束和表之间的关系.与现有数据源的交互通过DataAdapter来控制. 源代码示例: SqlDataAda ...

  7. android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  8. Android群英传笔记系列三 view的自定义:实现一个模拟下载

    1.实现效果:动态显示进度(分别显示了整个的动态改变的过程,然后完成后,弹出一个对话框)       2.实现过程:可以分为绘制一个圆,圆弧和文本三部分,然后在MainAcitivity中通过线程模拟 ...

  9. iOS 简单工厂模式

    iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...

  10. 【原】iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】

    本文的最新版本已经发布在简书[编程小翁]上,强烈建议到上查看简书,[点击这里跳转]. 在iOS中,图形可分为以下几个层次: 越上层,封装程度越高,动画实现越简洁越简单,但是自由度越低:反之亦然.本文着 ...