ISP的定义

  • 首先明确接口定义

    • 实例接口

      • 我们在Java中,一个类用New关键字来创建一个实例。抛开Java语言我们其实也可以称为接口。假设Person zhangsan = new Person();我们称Person类就是张三的接口类。
    • 类接口
      • Java中用interface定义的接口。
  • 其次明确隔离定义
    • 客户端不应该依赖他不需要的接口。
    • 类间的依赖关系应当建立在最小的接口上。
      • 首先第一种说明客户端依赖接口,依赖的接口不能过于臃肿,所以要进行细化。第二种定义也是要求接口进行细化,保持接口的纯洁。
      • 总结:建立单一接口,接口不要过分臃肿。接口要尽量细化,接口中要尽量少。
  • 接口隔离原则和单一职责原则
    • 明确单一职责原则是按照职责单一,是从业务逻辑角度来看。
    • 明确接口隔离原则是要求接口的方法要尽量的少。

ISP举例

聚合关系:空心棱形箭头,全体和部分的关系,与组合关系的区别是:组合关系彼此依靠,缺一不可,而聚合关系彼此之间是可以独立存在的。最明显的例子:人和车,人可以拥有车,但是不是必须的。车与轮子之间的关系:车必须拥有轮子。

  • 给出星探寻找美女的类图

  • 具体实现代码

  • 美女抽象接口:定了美女的标准

    package des.ISP;
//美女抽象类public
interface IPrettyGirl {   
//较好的面容   
public void goodLooking();   
//要有好的身材   
public void niceFigure();   
//要有气质   
public void greatTemmperament();
}
  • 美女实现类
package des.ISP;
//美女实现类
public class PrettyGirl implements IPrettyGirl {
//名字
private String name;
public PrettyGirl(String name){
this.name = name; }
@Override
public void goodLooking() {
System.out.println("拥有较好的面貌"); } @Override
public void niceFigure() {
System.out.println("拥有较好的身材");
} @Override
public void greatTemmperament() {
System.out.println("拥有较好的气质");
}
}
  • 抽象星探类
package des.ISP;

public abstract class AbstractSearcher {
protected IPrettyGirl prettyGirl;
public AbstractSearcher(IPrettyGirl _prettyGirl){
this.prettyGirl = _prettyGirl;
}
//搜索美女,列出美女列表
public abstract void show();
}
  • 具体实现类
package des.ISP;

public class Searcher extends AbstractSearcher {
public Searcher(IPrettyGirl _prettyGirl) {
super(_prettyGirl);
}
//展示美女的信息
@Override
public void show() {
System.out.println("美女信息如下..."); //展示面容
super.prettyGirl.goodLooking();
//展示气质
super.prettyGirl.greatTemmperament();
//展示气质
super.prettyGirl.niceFigure();;
}
}

运行结果:


我们看IPrettyGirl接口是否设计的合理?合理是相对的,我们如果从另外一个角度来看,对于美女的标准定义不同,比如一个人的气质很好,我们也可以称为美女,另外一个人的身材和外貌很美那我们也可以称位气质。从一定程度上来看,我们定义的这个接口是否太过臃肿了?里面存在很多可变的因素,比如只有气质很好,我们也可以称作美女。这样我们必须要将剩下的两个方法置空,这样做的目的肯定是不行的。

首先我们将,美女接口进行分解,分解为气质型和外表型,那么标准的美女就是同时实现这两个接口,那么气质型和外表型就分别实现这两个接口。



改写后的代码如下:

package des.ISP;

public interface IGreatTemperamentGirl {
//要有气质
public void greatTemmperament();
}
package des.ISP;
//外貌美女
public interface IGoodBodyGirl {
//较好的面容
public void goodLooking();
//要有好的身材
public void niceFigure();
}
package des.ISP;
//美女实现类
public class PrettyGirl implements IGoodBodyGirl,IGreatTemperamentGirl {
//名字
private String name;
public PrettyGirl(String name){
this.name = name; }
@Override
public void goodLooking() {
System.out.println(this.name+"拥有较好的面貌"); } @Override
public void niceFigure() {
System.out.println(this.name+"拥有较好的身材");
} @Override
public void greatTemmperament() {
System.out.println(this.name+"拥有较好的气质");
}
}
package des.ISP;

public abstract class AbstractSearcher {
protected IGoodBodyGirl iGoodBodyGirl;
protected IGreatTemperamentGirl iGreatTemperamentGirl;
public AbstractSearcher(IGoodBodyGirl _goodBodyGirl){
this.iGoodBodyGirl = _goodBodyGirl;
}
public AbstractSearcher(IGreatTemperamentGirl _iGreatTemperamentGirl){
this.iGreatTemperamentGirl = _iGreatTemperamentGirl;
}
//搜索美女,列出美女列表
public abstract void show();
}
package des.ISP;

public class Searcher extends AbstractSearcher {

    public Searcher(IGoodBodyGirl _goodBodyGirl) {
super(_goodBodyGirl);
}
public Searcher(IGreatTemperamentGirl _iGreatTemperamentGirl) {
super(_iGreatTemperamentGirl);
} @Override
public void show() {
super.iGoodBodyGirl.goodLooking();
super.iGoodBodyGirl.niceFigure();
super.iGreatTemperamentGirl.greatTemmperament();
}
}

此时存在的问题:场景类的写法,由于我们PrettyGirl是实现的两个接口,并且在星探类中采用的两个入参为抽象接口的构造方法,所以上面的写法只是对于两种不同类型的即气质型和外形两种,假如即是气质型和外形好的的话,我们要在星探抽象类再增加一个构造方法,此时入参为具体的实现类(此时入参不要再考虑依赖倒置原则,因为这些应用原则不是绝对使用,方便使用就用,不方便用不用即可。)

综述:上述的改进是对接口中可变的因素的细化的拆分,具体的实现代码是参考,只需明白UML表达的意思即可,即接口中的方法不能过分臃肿,否则一旦存在可变因素,接口耦合性就会变高。

六大设计原则(四)ISP接口隔离原则(上)的更多相关文章

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

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

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

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

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

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

  4. 八、ISP 接口隔离原则

    ISP应用的场景是某些类不符合SRP原则,但使用这些类的客户端应该根据它们的父类来使用(我感觉这句话应该改为:客户端应该根据它们的抽象类\接口来使用它们),而不是直接使用它们. 定义: 客户端不应该依 ...

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

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

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

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

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

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

  8. ISP接口隔离原则

    一.定义 不应该强迫客户程序依赖并未使用的方法 二.接口污染 接口污染,在C#.C++这样的静态类型语言中是很常见的.一个接口会被他不需要的方法污染.在接口中假如一个方法只是为了能给它的一个子类带来好 ...

  9. 第2章 面向对象的设计原则(SOLID):4_接口隔离原则(ISP)

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

随机推荐

  1. numpy C语言源代码调试(二)

    前一篇已经介绍,可以使用gdb进行调试,但是本人不太习惯gdb的文本界面,所以希望找一个比较好用的gdb的前端gui调试器. 想到的第一个是一个非常老的调试工具,DDD. DDD - Data Dis ...

  2. img 灰色默认外边框的去除

    最近在做一个小游戏时发现了一个问题,总是在弹出img时先出现一个灰色的边框,所以为了查找问题,查找了一些关于img 默认边框的小知识点. 在这里整理了一些知识点: 一. 下面代码都试验过后会发现,im ...

  3. SpringBoot进阶教程(二十五)整合Redis之@Cacheable、@CachePut、@CacheEvict的应用

    在上一篇文章(<SpringBoot(二十四)整合Redis>)中,已经实现了Spring Boot对Redis的整合,既然已经讲到Cache了,今天就介绍介绍缓存注解.各家互联网产品现在 ...

  4. Unity_新手必懂知识点

    翻车了!!!一个小例子带你了解闭包.事故现场:场景:6个button,上方1个text.点击button,text会显示button上的数字.代码如下: //在unity里面赋值public List ...

  5. 使用redis 中的事务处理实现商品秒杀

    redis中的事务处理: redis中的事物事物处理是指能够批量的执行一组命令(当事务开始执行时,事务中的命令能够按照按照规定好的顺序执行而不会被插队或打断): 与mysql事务的区别在于:mysql ...

  6. wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)

    CSS3的出现给网站页面增加了活力,网站增色不少,有这么小小的一款插件就能做出很多动画效果. 最重要的是它:简单易用.轻量级.无需 jQuery......他就是wow.js 地址:https://d ...

  7. 微信小程序之菜鸟选手入门教学(一)

    1. 小程序的优缺点优点:不需下载.卸载 使用方便缺点:嵌套在微信中,属于微信的子应用2. 使用的技术实际上是Hybrid技术的应用Hybrid App (混合模式移动应用),使用网页语言和程序语言共 ...

  8. Alpha阶段Scrum Meeting合集(江山代有才人秃队)

    Day URL 第一天 第1篇Scrum冲刺博客 第二天 第2篇Scrum冲刺博客 第三天 第3篇Scrum冲刺博客 第四天 第4篇Scrum冲刺博客 第五天 第5篇Scrum冲刺博客 第六天 第6篇 ...

  9. CAP 2.4版本发布,支持版本隔离特性

    前言 自从上次 CAP 2.3 版本发布 以来,已经过去了几个月的时间,这几个月比较忙,所以也没有怎么写博客,趁着2019年到来之际(现在应该是2019年开始的时候),CAP也发布了2018年的最后一 ...

  10. [Swift-2019力扣杯春季决赛]3. 最长重复子串

    给定字符串 S,找出最长重复子串的长度.如果不存在重复子串就返回 0. 示例 1: 输入:"abcd" 输出:0 解释:没有重复子串. 示例 2: 输入:"abbaba& ...