java设计模式5,接口隔离原则

举报
哪吒编程 发表于 2022/08/06 00:23:54 2022/08/06
【摘要】 目录 一、接口隔离原则二、模拟场景三、违背原则方案1、程序员的职责接口2、项目经理3、开发人员4、测试人员 四、接口隔离原则概述代码1、设计接口2、开发接口3、测试接口4、运维接口5、项目...

在这里插入图片描述

一、接口隔离原则

客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。

接口隔离原则要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法

接口隔离是为了高内聚、低耦合。在实际的业务开发中,通常会先定义好需要开发的接口,并由各个实现类实现。但如果没有经过考虑和设计,就很可能造成一个接口中包含众多的接口方法,而这些接口并不一定在每一个类中都需要实现。这样的接口很难维护,也不易于扩展,每一次修改验证都有潜在的风险。

  1. 将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
  2. 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。
  3. 使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。
  4. 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。

二、模拟场景

通过模拟开发部经理、项目经理、员工之间的关系的例子来说明迪米特法则。

  1. 项目经理负责项目的设计、开发;
  2. 后端工程师负责项目的开发、测试、运维;
  3. 测试工程师负责项目的测试;

三、违背原则方案

我相信你一定写过类似的代码,看似设计感满满,面向接口编程,扩展性良好,结果一地鸡毛。

1、程序员的职责接口

package com.guor.beanutil.principle.isolation;

/**
 * 程序员的职责
 */
public interface Responsibility {

    // 设计
    void design();

    // 开发
    void develop();

    // 测试
    void test();

    // 运维
    void maintain();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2、项目经理

package com.guor.beanutil.principle.isolation;

/**
 * 项目经理
 */
public class ProjectManager implements Responsibility{
    @Override
    public void design() {
        System.out.println("设计");
    }

    @Override
    public void develop() {
        System.out.println("开发");
    }

    @Override
    public void test() {
		// 无此职责的实现
    }

    @Override
    public void maintain() {
		// 无此职责的实现
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3、开发人员

package com.guor.beanutil.principle.isolation;

/**
 * 开发人员
 */
public class Programmer implements Responsibility{
    @Override
    public void design() {
		// 无此职责的实现
    }

    @Override
    public void develop() {
        System.out.println("开发");
    }

    @Override
    public void test() {
        System.out.println("测试");
    }

    @Override
    public void maintain() {
        System.out.println("运维");
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

4、测试人员

package com.guor.beanutil.principle.isolation;

/**
 * 测试人员
 */
public class TestPerson implements Responsibility{
    @Override
    public void design() {
		// 无此职责的实现
    }

    @Override
    public void develop() {
		// 无此职责的实现
    }

    @Override
    public void test() {
        System.out.println("我只负责测试, so easy");
    }

    @Override
    public void maintain() {
		// 无此职责的实现
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

四、接口隔离原则概述代码

接口隔离原则要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法

1、设计接口

package com.guor.beanutil.principle.isolation;

/**
 * 设计
 */
public interface DesignService {

    void design();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2、开发接口

package com.guor.beanutil.principle.isolation;

/**
 * 开发
 */
public interface DevelopService {

    // 开发
    void develop();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3、测试接口

package com.guor.beanutil.principle.isolation;

/**
 * 测试
 */
public interface TestService {

    // 测试
    void test();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4、运维接口

package com.guor.beanutil.principle.isolation;

/**
 * 运维
 */
public interface MaintainService {

    // 运维
    void maintain();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5、项目经理

package com.guor.beanutil.principle.isolation;

/**
 * 项目经理
 */
public class ProjectManager implements DesignService,DevelopService {

    @Override
    public void design() {
        System.out.println("设计");
    }

    @Override
    public void develop() {
        System.out.println("开发");
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

6、开发人员

package com.guor.beanutil.principle.isolation;

import com.guor.beanutil.principle.isolation2.Responsibility;

/**
 * 开发人员
 */
public class Programmer implements DevelopService,TestService,MaintainService{

    @Override
    public void develop() {
        System.out.println("开发");
    }

    @Override
    public void test() {
        System.out.println("测试");
    }

    @Override
    public void maintain() {
        System.out.println("运维");
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

7、测试人员

package com.guor.beanutil.principle.isolation;

/**
 * 测试人员
 */
public class TestPerson implements TestService {

    @Override
    public void test() {
        System.out.println("我只负责测试, so easy");
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4个类秒变7个类,这设计靠谱吗?

现在看来管理人员、开发人员、测试人员都按需实现了各职责接口。不用再实现不必要的职责方法了,提高了代码的可靠性,降低开发成本和维护成本。

接口隔离原则虽然看似简单,但如果想在实际项目开发中,将各模块、功能规划的井井有条,运用的炉火纯青、恰到好处,真的很难。反复阅读,仔细体会。

设计模式系列文章:

java设计模式1,单一职责原则

java设计模式2,开闭原则

java设计模式3,里氏替换原则

java设计模式4,不要和陌生人说话

在这里插入图片描述

文章来源: blog.csdn.net,作者:哪 吒,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/guorui_java/article/details/126074175

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。