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. .Net Core 权限验证与授权(AuthorizeFilter、ActionFilterAttribute)

    在.Net Core 中使用AuthorizeFilter或者ActionFilterAttribute来实现登录权限验证和授权 一.AuthorizeFilter 新建授权类AllowAnonymo ...

  2. Python:基于MD5的文件监听程序

    前述 写了一个基于MD5算法的文件监听程序,通过不同的文件能够生成不同的哈希函数,来实现实现判断文件夹中的文件的增加.修改.删除和过滤含有特定字符的文件名的文件. 需求说明 需要实现对一个文件夹下的文 ...

  3. EFCore动态切换Schema

    最近做个分库分表项目,用到schema的切换感觉还是有些坑的,在此分享下. 先简要说下我们的分库分表 分库分表规则 我定的规则是,订单号(数字)除以16,得出的结果为这个订单所在的数据库,然后他的余数 ...

  4. 模块使用:time、datetime、calendar、sys、os、os.path、normcase和normapath、random、json、pickle

    ## time:时间 时间戳(timestamp):time.time() 延迟线程的运行:time.sleep(secs) (指定时间戳下的)当前时区时间:time.localtime([secs] ...

  5. 【swoole】如何在docker+swoole环境下测试udp服务

    前面几篇文章讲了使用 docker+swoole 环境来测试tcp服务以及如何测试,但是当我开始学习udp服务那块的时候,发现使用原来的方式在 docker+swoole 环境下行不通啦,后来发现如果 ...

  6. headfirst设计模式(9)—模板方法模式

    前言 这一章的模板方法模式,个人感觉它是一个简单,并且实用的设计模式,先说说它的定义: 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下, ...

  7. 基于flexbox纯css框架的解析

    学CSS很好的一个方法大概是先用纯CSS来实现一个自己的框架,然后便可以在之后的使用中对一开始可能很粗糙的框架做细致的优化与改进,删除些冗余,添加些功能之类的. 当然,为了避免一开始写框架时候的时候手 ...

  8. HTML 练习淡入淡出

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 底部导航栏-----FragmentTabHost

    [说明] 1.主界面上添加父容器:FragmentTabHost 属于v4兼容包 需要指定该id为android:id/tabhost,不能修改,表示由android系统来托管这个id. 本身是一个F ...

  10. vue 对列表数组删除和增加

    很重要,一定要好好研究 https://cn.vuejs.org/v2/guide/list.html#%E6%9B%BF%E6%8D%A2%E6%95%B0%E7%BB%84