文档章节

六大设计原则(四)ISP接口隔离原则(上)

o
 osc_gu9d45li
发布于 2019/04/21 16:22
字数 1235
阅读 7
收藏 0

精选30+云产品,助力企业轻松上云!>>>

ISP的定义

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

ISP举例

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

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

file

  • 具体实现代码

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

    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();;
    }
}

运行结果: file


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

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表达的意思即可,即接口中的方法不能过分臃肿,否则一旦存在可变因素,接口耦合性就会变高。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
设计模式之六大原则

设计模式的六大原则都是为了实现代码的高内聚低耦合。高内聚低耦合的进一步实现是设计模式的六大原则,设计模式的六大原则进一步实现就是设计模式。 一、单一职责原则 单一职责原则(Single R...

YounTao
2018/05/23
0
0
六大设计原则快速记忆SOLID

常见的面向对象设计的原则,可以简化为SOLID原则,坚固slidi的软件需要遵循的原则。 1、单一职责原则SRP(Single Responsibility Principle) 定义:不要存在多于一个导致类变更的原因。通俗...

凯文加内特
2014/02/12
177
0
面向对象的六大原则之 接口隔离原则——ISP

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

osc_ugeljcjn
2019/07/22
1
0
设计模式六大原则简单总结

设计模式有六大基本的设计原则,现简单总结如下: 原则名称 1 、SRP(Single Responsibility Principle)单一职责。 2、LSP(Listkov Substitution Principle)里氏替换原则。 3、DIP (Dep...

辉兔狼
2013/03/28
908
0
设计模式六大原则:接口隔离原则

目录:   设计模式六大原则:单一职责原则   设计模式六大原则:接口隔离原则   设计模式六大原则:依赖倒置原则   设计模式六大原则:里氏替换原则   设计模式六大原则:迪米特法...

osc_kwrafgul
04/16
5
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么从HBase的0.96版本开始,舍弃了-ROOT-文件?

HBase结构的读写流程 (1). HBase0.96版本之前: (2). HBase0.96开始: a. 当客户端获取到.meta文件的位置之后,会缓存.meta.文件的位置 b. 客户端还会缓存HRegion的位置 -ROOT-存在的意义: ...

其乐m
23分钟前
12
0
volatile关键字对 - What is the volatile keyword useful for

问题: At work today, I came across the volatile keyword in Java. 今天的工作中,我遇到了Java中的volatile关键字。 Not being very familiar with it, I found this explanation: 不太熟......

技术盛宴
28分钟前
25
0
golang 封装 mysql 和 redis 连接

Mysql封装 package dbimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx")var DB *sqlx.DBfunc init(){database, err := sqlx.Op......

开源中国最牛的人
29分钟前
16
0
pdfbox 读取文件报错 java.io.IOException: Page tree root must be a dictionary

pdfbox java.io.IOException: Page tree root must be a dictionary 示例代码 public static void main(String[] args) { try (InputStream sampleInputs = new ClassPathResource("s......

lemos
37分钟前
28
0
整理 Linux下列出目录内容的命令

在 Linux 中,有非常多的命令可以让我们用来执行各种各样的任务。当我们想要像使用文件浏览器一样列出一个目录下的内容时,大家第一时间想到的是 ls 命令。但只有 ls 命令能实现这个目的吗?...

良许Linux
38分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部