DesignPattern系列__02接口隔离原则
介绍
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上。
Demo引入
先来看一张图:
interface MyInterface {
void operation1();
void operation2();
void operation3();
void operation4();
void operation5();
}
class B implements MyInterface {
@Override
public void operation1() {
System.out.println("B实现了operation1");
}
@Override
public void operation2() {
System.out.println("B实现了operation2");
}
@Override
public void operation3() {
System.out.println("B实现了operation3");
}
@Override
public void operation4() {
System.out.println("B实现了operation4");
}
@Override
public void operation5() {
System.out.println("B实现了operation5");
}
}
class D implements MyInterface {
@Override
public void operation1() {
System.out.println("D实现了operation1");
}
@Override
public void operation2() {
System.out.println("D实现了operation2");
}
@Override
public void operation3() {
System.out.println("D实现了operation3");
}
@Override
public void operation4() {
System.out.println("D实现了operation4");
}
@Override
public void operation5() {
System.out.println("D实现了operation5");
}
}
class A {
//类A通过接口MyInterface依赖(使用)B类, 但是只使用1,2,3方法
public void depand1(MyInterface myInterface) {
myInterface.operation1();
}
public void depand2(MyInterface myInterface) {
myInterface.operation2();
}
public void depand3(MyInterface myInterface) {
myInterface.operation3();
}
}
class C {
public void depand1(MyInterface myInterface) {
myInterface.operation1();
}
public void depand4(MyInterface myInterface) {
myInterface.operation4();
}
public void depand5(MyInterface myInterface) {
myInterface.operation5();
}
}
如上图所示:类A通过接口MyInterface依赖类B,类C通过接口MyInterface依赖类D;但是,类A只是想要使用B实现的接口MyInterface中的1,2,3方法,类C想要使用类D实现的接口MyInterface中的1,4,5方法;所以,现在的设计,从接口隔离原则的角度来说,不符合“最小接口”。
改进措施:
既然接口MyInterface中的方法对于实现类来说,不是全部都需要的,那么,我们根据需求,将原来的接口进行拆分:
如图所示: 将原来的一个接口拆分为三个,对应的code如下:
interface MyInterface1 {
void operation1();
}
interface MyInterface2 {
void operation2();
void operation3();
}
interface MyInterface3 {
void operation4();
void operation5();
}
class B implements MyInterface1, MyInterface2 {
@Override
public void operation1() {
System.out.println("B实现了operation1");
}
@Override
public void operation2() {
System.out.println("B实现了operation2");
}
@Override
public void operation3() {
System.out.println("B实现了operation3");
}
}
class D implements MyInterface1, MyInterface3 {
@Override
public void operation1() {
System.out.println("D实现了operation1");
}
@Override
public void operation4() {
System.out.println("D实现了operation4");
}
@Override
public void operation5() {
System.out.println("D实现了operation5");
}
}
class A {
//类A通过接口MyInterface依赖(使用)B类, 但是只使用1,2,3方法
public void depand1(MyInterface1 myInterface) {
myInterface.operation1();
}
public void depand2(MyInterface2 myInterface) {
myInterface.operation2();
}
public void depand3(MyInterface2 myInterface) {
myInterface.operation3();
}
}
class C {
public void depand1(MyInterface1 myInterface) {
myInterface.operation1();
}
public void depand4(MyInterface3 myInterface) {
myInterface.operation4();
}
public void depand5(MyInterface3 myInterface) {
myInterface.operation5();
}
}
总结
接口的设计尽量要小
这是接口隔离的核心,当然过小的接口会导致项目结构的负责度增加,在实际使用中,要合理把握尺度。
接口要高内聚
即接口尽量少的公布public方法,在项目开发中,接口通常充当规范来使用,是一种承诺,承诺越少越有利于系统开发。
DesignPattern系列__02接口隔离原则的更多相关文章
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:htt ...
- C#软件设计——小话设计模式原则之:接口隔离原则ISP
前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...
- 设计原则:接口隔离原则(ISP)
接口隔离原则的英文是Interface Segregation Principle,缩写就是ISP.与里氏替换原则一样其定义同样有两种 定义1: Clients should not be force ...
- 设计模式之接口隔离原则(ISP)
一.定义: ISP:Interface Segregation Principle 接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接 ...
- 设计模式之六大原则——接口隔离原则(ISP)
设计模式之六大原则——接口隔离原则(ISP) 转载于:http://www.cnblogs.com/muzongyan/archive/2010/08/04/1792528.html 接口隔离原则 ...
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...
- 第2章 面向对象的设计原则(SOLID):4_接口隔离原则(ISP)
4. 接口隔离原则(Interface Segregation Principle,ISP) 4.1 定义 (1)使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口.类间的 ...
- 4.接口隔离原则(Interface Segregation Principle)
1.定义 客户端不应该依赖它不需要的接口: 一个类对另一个类的依赖应该建立在最小的接口上. 2.定义解读 定义包含三层含义: 一个类对另一个类的依赖应该建立在最小的接口上: 一个接口代表一个角色,不应 ...
- 【设计模式六大原则4】接口隔离原则(Interface Segregation Principle)
定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类 ...
随机推荐
- Python初探-基础篇
python和其他语言其实是相似的,如果你会了另一门语言,那学习这个语言,会很快上手 1.mac下自带的有python,版本为2.7.0(可以用home brew python3 安装最新版本的pyt ...
- selenium3+python3自动化测试学习之网页元素定位
selenium基础实战之定位网页元素技巧 selenium定位网页元素 find_element_by_id,find_element_by_name,find_element_by_class_n ...
- vboxnetctl: no such file or directory
 sudo /Library/StartupItems/VirtualBox/VirtualBox restart sudo /Library/StartupItems/VirtualBox/Vir ...
- springboot配置文件外置处理
前言: 在springboot项目中,一般的配置文件都在resource/config下面,它可以以两种方式存在,一种是yml,一种是properties方式. 当运维和开发分开的时候,比如连接mys ...
- ~~小练习:python的简易购物车~~
进击のpython 1,用户先给自己的账户充钱:比如先充3000元. 2,有如下的一个格式: goods = [{"name": "电脑", "pri ...
- sql server编写通用脚本实现获取一年前日期的方法
问题: 在数据库编程开发中,有时需要获取一年前的日期,以便以此为时间的分界点,查询其前后对应的数据量.例如:1. 想查询截止到一年前当天0点之前的数据量,以及一年前当天0点开始到现在的数据量.2. 想 ...
- 20141111-WCF获得Web路径
在WCF中调用Server.MapPath 获取服务发布目录路径 在WCF中调用Server.MapPath 获取服务发布目录路径 在WCF中想使用Server.Map获取当前服务发布目录的绝对路径. ...
- 【小家Spring】Spring IoC是如何使用BeanWrapper和Java内省结合起来给Bean属性赋值的
#### 每篇一句 > 具备了技术深度,遇到问题可以快速定位并从根本上解决.有了技术深度之后,学习其它技术可以更快,再深入其它技术也就不会害怕 #### 相关阅读 [[小家Spring]聊聊Sp ...
- [Spring+SpringMVC+Mybatis]框架学习笔记(六):事务
第7讲 事务 7.1 事务的概念 事务是一系列作为一个逻辑单元来执行的操作集合. 它是数据库维护数据一致性的单位,它讲数据库从一个一致状态,转变为新的另外一个一致状态.说的简单一点就是:如果一组处理步 ...
- python3.5学习笔记(说明)
本内容是自己在学习python过程中总结的知识点,只用于学习和交流,请勿用作商业用途,部分内容来自网络,如有侵权,联系删除.